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

时间:2012-11-28 13:10:56

标签: java hibernate hsqldb

我正在使用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 : 启用S​​QL语句的日志记录后,我看到回滚了这三个表的CREATE TABLE语句。我无法获得有关这些create table语句错误的任何进一步信息。此外,CREATE TABLE语句在打印时会被截断。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

好吧,我猜你的代码中确实没有这个确切的文字:

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

(带有一个实际的<TABLE_NAME>字符串),但你写的就是一个通用/伪代码示例。 (因为如果您实际使用字符串“<TABLE_NAME>”,那么对于hibernate来说它将是一个无效字符串,并且它不会创建模式。)

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

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