我注解了一堆POJO,以便JPA可以使用它们在Hibernate中创建表。似乎所有的表都被创建了,除了一个非常中心的名为“Revision”的表。Revision类有一个@Entity(name="RevisionT")
注解,所以它将被重命名为RevisionT,这样就不会与MySQL(目标数据库)中的任何保留字发生冲突。
我删除整个数据库,重新创建它,然后打开和关闭一个JPA会话。所有的表格似乎都可以毫无问题地重新创建。
为什么创建的模式中会缺少一个表?可以使用什么检测来查看Hibernate正在产生什么以及哪些错误?
谢谢
更新:我尝试创建一个Derby DB,并且成功了。但是,其中一个字段的名称为“index”。我使用@org.hibernate.annotations.IndexColumn
将名称指定为保留字以外的名称。但是,在创建列时,该列始终称为“索引”。
下面是可疑注解的示例。
@ManyToOne
@JoinColumn(name="MasterTopID")
@IndexColumn(name="Cx3tHApe")
protected MasterTop masterTop;
它不是将MasterTop.Cx3tHApe
创建为字段,而是创建MasterTop.Index
。为什么名字被忽略了?
7条答案
按热度按时间slhcrj9b1#
如果这对任何人都有帮助,这件事今天发生在我身上,结果我在实体定义中使用了一个保留字:
“order”,Hibernate只是跳过了这个类。请检查您的用户定义名称!:)
干杯,马克
mnemlml82#
回答您的附带问题(可以使用什么检测来查看Hibernate正在生成什么以及哪些错误?)
你可以
org.hibernate.tool.hbm2ddl.SchemaExport
来生成你的表。第一个参数允许您查看此命令生成的HQL(
CREATE TABLE
s等)。第二个是它是否应该实际执行任何修改(即false = dry-run)。因此,使用
(true, false)
运行它将向您展示Hibernate将对表执行的操作,而无需更改任何内容。ghg1uchk3#
@Entity
上的name attribute不是您要用于此目的的。使用@Table
注解:q43xntqr4#
对我来说,这是columnDefinition中的语法错误。很容易被调试日志检测到。
vq8itlhq5#
这是由于列名与您的sql保留字匹配。您可以尝试更改列的名称。我遇到过类似的问题。
nzkunb0c6#
也许你使用了错误的注解。有一次我不小心用
@org.hibernate.annotations.Entity
而不是@javax.persistence.Entity
注解了一个实体,Hibernate跳过了它。nkoocmlb7#
将hibernate.show_sql配置属性设置为true,并查看Hibernate是否生成了创建表代码。如果是这样,请将create语句复制到数据库客户机(ui或命令行)中,查看数据库是否返回错误。
对我来说,错误是不明显的,直到我这样做。
我使用了字段名'condition',这是一个保留的MySQL单词。所以请检查您的字段名称...