使用 Hibernate 和 HSQLDB 找不到表
Posted
技术标签:
【中文标题】使用 Hibernate 和 HSQLDB 找不到表【英文标题】:Table Not Found with Hibernate and HSQLDB 【发布时间】:2009-09-18 00:57:12 【问题描述】:我们使用休眠实体管理器通过 JPA 映射我们的实体。我们正在使用 HSQLDB 内存数据库进行单元测试。一切都很好,直到最近对模型的重构开始导致以下错误:
17:55:48.516 [main] WARN o.h.util.JDBCExceptionReporter - SQL Error: -22, SQLState: S0002
17:55:48.517 [main] ERROR o.h.util.JDBCExceptionReporter - Table not found in statement
我不能发布有问题的 SQL,但是任何人都可以给我指出上述错误的可能原因吗?特别是因为我知道代码以前可以工作。由于重构,hibernate 似乎正在生成无效的 sql?
【问题讨论】:
【参考方案1】:这也可能表明 JDBC 驱动程序和 Hibernate 方言不匹配。
当 JDBC 驱动程序连接是 HSQLDB 并且 Hibernate 方言是 org.hibernate.dialect.Oracle10gDialect 时,我们得到了这个。
对应的异常信息: [错误]:无法获取数据库元数据 java.sql.SQLException:在语句 [select sequence_name from all_sequences] 中找不到表
【讨论】:
Hibernate 需要设置 SQL 方言。它需要匹配 jdbc uri 中配置的数据库供应商。可以在这里找到如何配置 Hibernate session-factory 以使用某种 SQL 方言的示例:docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/…【参考方案2】:嗯,桌子真的在那里吗?为 Hibernate 启用 SQL 输出并根据实际的数据库架构检查它。
您的重构可能失败(实体和表已重命名;命名查询未更新)。
或者您可能在类路径中的某个位置有一个较旧的类,导致读取错误的注释。
【讨论】:
原来实体被命名为保留字,导致创建表失败。 保留字 - 我遇到了同样的问题!【参考方案3】:我们也遇到了同样的异常。事实证明,属性 hibernate.dialect 被设置为 org.hibernate.dialect.Oracle10gDialect,H2 数据库作为数据源。解决方案是删除 hibernate.dialect 并且不使用任何值。 Hibernate 能够自动检测从数据源配置中检索到的基于方言的元数据有关 hibernate 如何自动检测方言的详细信息https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/portability.html
【讨论】:
【参考方案4】:我也有这个问题,在我的情况下,我在实体中有类似的东西
@Column(name = "AVAIL_TARGET_PERCENT", columnDefinition = "number(5,2)", nullable = false)
只要避免 columnDefinition(把它拿出来!),你应该没问题。我这样做了,问题解决了
【讨论】:
【参考方案5】:使用依赖
groupId org.hsqldb
而不是
groupId hsqldb
在你的 pom.xml 或 gradle 中。查看https://mvnrepository.com/search?q=hsqldb
【讨论】:
以上是关于使用 Hibernate 和 HSQLDB 找不到表的主要内容,如果未能解决你的问题,请参考以下文章