HSQLDB 2.2 跳过某些实体而不为它们创建表

Posted

技术标签:

【中文标题】HSQLDB 2.2 跳过某些实体而不为它们创建表【英文标题】:HSQLDB 2.2 skipping certain entities and not creating tables for them 【发布时间】:2012-11-28 13:10:56 【问题描述】:

我正在与Hibernate 3.5.5HSQLDB 2.2.9 合作。我使用 JPA 语义来定义实体并拥有大约 10 个实体。

由于某些未知原因,HSQLDB 似乎没有选择三个实体,因为我在 HSQLDB 资源管理器中找不到相应的表,并且对这些表的任何引用都会导致 SQL 异常 user lacks privilege or object not found: <TableName>

所有三个实体的格式都与其他实体相同,如下所示:

@Entity
@Table(name = "<TABLE_NAME>")
public class TableName

     // private members;

     // protected default constructor for the ORM

     @Id
     @Column(name = <PRIMARY_KEY>)
     // public getter for Primary Key member.

     @Column(name = <COLUMN_NAME>)
     // public getters for all other members;

     // protected setters

是否有人遇到过 HSQLDB 跳过某些实体的类似问题?

至少,它一直在跳过相同的三个实体,我无法弄清楚这些实体与其他实体有什么不同。所有这些实体都是使用 Eclipse 中的 JPA facet 生成的,因此它们之间没有区别。

编辑 1

我的 persistence.xml 就是这样:

<persistence-unit name="fssPersistenceUnit" transaction-type="RESOURCE_LOCAL">
</persistence-unit>

而 HSQLDB 2.0 用于选择所有带有 @Entity 注释的实体,而 HSQLDB 2.2.9 并没有选择所有实体,如前所述留下三个实体。

编辑 2: 启用 SQL 语句的日志记录后,我看到这三个表的 CREATE TABLE 语句被回滚。我无法获得有关这些创建表语句有什么问题的任何进一步信息。此外,CREATE TABLE 语句在打印时会被截断。

【问题讨论】:

伙计 - 你解决了这个问题吗?我现在面临它:( 【参考方案1】:

HSQLDB 的 Hibernate 方言在 Hibernate 3.6 及更高版本中进行了更新。不知道 3.5.x 是否能很好地与 HSQLDB 2.2.x 配合使用

在任何情况下,您都可以使用 file: database 并将 hsqldb.sqllog=2 属性添加到数据库 URL。这将生成所有已执行 SQL 语句的日志。然后您可以检查缺少的表的语句。

查看指南:

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

【讨论】:

谢谢。将 hsqldb.sqllog 属性添加到 URL 后,我可以看到这三个表的 CREATE 表语句已回滚。但我无法弄清楚为什么。此外,CREATE TABLE 语句在打印期间会被截断。是否有一些设置可以打印整个语句? 我正在删除最后一条评论,因为 ROLLBACK 表示有错误。在以后的版本中会有一个 hsqldb.sqllog=3 级别。现在,让 Hibernate 报告 SQL 并报告未创建的表的 SQL。也尝试使用 2.2.8,但问题似乎是 Hibernate 3.5.x 和 HSQLDB 2.x 的组合。使用更新的 Hibernate。 升级到 Hibernate 3.6+ 不在我手中,因为它需要由其他团队打包,供内部使用。我将尝试通过 Hibernate 打印 SQL,看看出了什么问题。非常感谢您的帮助。【参考方案2】:

好吧,我猜你的代码中实际上并没有这个确切的文本:

@Entity
@Table(name = "<TABLE_NAME>")
public class TableName

(带有实际的&lt;TABLE_NAME&gt; 字符串),但是您将其编写为通用/伪代码示例。 (因为如果您实际使用字符串“&lt;TABLE_NAME&gt;”,那么它对于休眠来说将是一个无效的字符串,并且它不会创建架构)。

您能否告诉我们您在没有由 Hibernate 创建表的实体上使用的实际表名和列名?在某些情况下,底层数据库(在您的情况下为 HSQLDB)有一些保留字,它不允许用于表和/或名称,如果是这种情况,它可能会静默失败(我在 PostgreSQL 和 mysql 中偶然发现了这一点,其中Hibernate 生成的模式可以在 MySQL 中工作,但会默默地无法在 PostgreSQL 中创建某些表,因为后者不“喜欢”某个表名)。

这同样适用于字段/列名。

【讨论】:

是的,那只是为了传达占位符。表名与保留关键字(每个单词之间带有下划线的业务实体,例如 EPC_ITEM)没有办法 @Vikdor 列名也是如此?另外,如果您尝试在另一个数据库(如 MySQL 或 PostgreSQL)上使用您的示例,您是否有同样的问题(可能还有更详细的日志说明为什么来自数据库)?

以上是关于HSQLDB 2.2 跳过某些实体而不为它们创建表的主要内容,如果未能解决你的问题,请参考以下文章

从联接表中删除实体而不影响父级 - EF Core 2.2

索引 HSQLDB?

实体框架 - 有效地删除所有子实体而不加载它们

遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框

hsqldb 模式创建

比较 hsqldb 中的两个表