我正在使用Hibernate 3.5.5
和HSQLDB 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语句错误的任何进一步信息。此外,CREATE TABLE语句在打印时会被截断。
答案 0 :(得分:1)
HSQLDB的Hibernate方言在Hibernate 3.6及更高版本中进行了更新。目前尚不清楚3.5.x是否适用于HSQLDB 2.2.x
在任何情况下,您都可以使用file:database并将hsqldb.sqllog = 2属性添加到数据库URL。这将生成所有已执行的SQL语句的日志。然后,您可以检查缺失表的语句。
参见指南:
答案 1 :(得分:0)
好吧,我猜你的代码中确实没有这个确切的文字:
@Entity
@Table(name = "<TABLE_NAME>")
public class TableName
(带有一个实际的<TABLE_NAME>
字符串),但你写的就是一个通用/伪代码示例。 (因为如果您实际使用字符串“<TABLE_NAME>
”,那么对于hibernate来说它将是一个无效字符串,并且它不会创建模式。)
您能告诉我们您在没有Hibernate创建的表的实体上使用的实际表名和列名吗?在某些情况下,底层的db(在你的情况下为HSQLDB)有一些保留字,它不允许表和/或名称,如果是这样的话,它可能会无声地失败(我在PostgreSQL和MySQL中偶然发现了这一点,其中一个Hibernate生成的模式可以在MySQL中运行,但是默认情况下无法在PostgreSQL中创建某些表,因为某个表名不被后者“喜欢”。
同样适用于字段/列名称。