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

新手上路,请多包涵

我正在尝试使用 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 编辑器执行相同的查询,它执行得很好。你能帮我解决这个问题吗?

原文由 Raju Boddupalli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 933
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"

请注意,根据您的配置可能会有所不同,它可能是 hibernate.connection.url=spring.datasource.url= 对于那些不使用休眠模式创建但使用 SQL 脚本的人,您应该在您的脚本

SET DATABASE SQL SYNTAX ORA TRUE;

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

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

原文由 Damien MIRAS 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题