HSQL 数据库用户缺少权限或找不到对象错误

2022-09-01 03:55:43

我正在尝试使用hsqldb-2.3.4从Spring应用程序连接。

我使用以下详细信息创建了数据库

Type : HSQL Database Engine Standalone
Driver: org.hsqldb.jdbcDriver
URL: jdbc:hsqldb:file:mydb
UserName: SA
Password: SA

我在“MYDB”架构下创建了一个名为“ALBUM”的表

在弹簧配置文件中:

<bean id="jdbcTemplate"
    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dbcpDataSource" />
</bean>

<bean id="dbcpDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:file:mydb" />
    <property name="username" value="SA" />
    <property name="password" value="SA" />
</bean>

在我的弹簧控制器中,我正在做jdbcTemplate.query("SELECT * FROM MYDB.ALBUM", new AlbumRowMapper());

它给了我例外:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT * FROM MYDB.ALBUM]; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: ALBUM
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

如果我通过hsqldb的SQL编辑器执行相同的查询,它执行得很好。你能帮帮我吗?


答案 1

正如之前的答复所说,有许多可能的原因。其中之一是由于语法不兼容而未创建表。如果使用特定的数据库供应商语法或特定功能,HSQLDB 将无法识别它。然后,在执行创建代码时,您可以看到由于此语法原因而未创建表。例如,如果实体在创建表时被注释,则表将失败。@Column(columnDefinition = "TEXT")

有一个解决方法,告诉HSQLDB处于pgsl的兼容模式,您应该将连接URL附加到该模式下

"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_pgs=true"

对于 mysql

"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_mys=true"

神谕

"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_ora=true" 

请注意,根据您的配置,可能会有变体,或者对于那些不使用休眠模式创建但SQL脚本的人,您应该在脚本中使用这种语法hibernate.connection.url=spring.datasource.url=

SET DATABASE SQL SYNTAX ORA TRUE;

它还将修复由于SQL请求中供应商特定语法引起的问题,例如posgresql的array_agg

注意:当代码解析模型以创建模式,然后隐藏在许多日志行中时,问题发生得很早,然后unitTested代码崩溃,出现令人困惑和模糊的异常“用户缺乏特权或找不到对象错误”,这根本没有指出真正的问题。因此,请确保从头开始读取所有跟踪并修复所有可能的问题


答案 2

user lacks privilege or object not found可能有多种原因,最明显的是您正在访问一个不存在的表。一个不太明显的原因是,当您运行代码时,与文件数据库URL的连接实际上可以创建数据库。您遇到的场景可能是您使用 HSQL 数据库管理器设置了数据库,添加了表和行,但这不是您的 Java 代码使用的此特定实例。您可能需要检查工作区中是否有这些文件的多个副本:、、、 等。如果您的 Java 代码确实创建了这些文件,则位置取决于您运行程序的方式。例如,在 Netbeans 内部运行的 Maven 项目中,文件与 pom.xml一起存储。mydb.logmydb.lckmydb.properties


推荐