java 表不是由Hibernate创建的

qni6mghb  于 2023-05-12  发布在  Java
关注(0)|答案(7)|浏览(124)

我注解了一堆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。为什么名字被忽略了?

slhcrj9b

slhcrj9b1#

如果这对任何人都有帮助,这件事今天发生在我身上,结果我在实体定义中使用了一个保留字:

@OneToMany(mappedBy="list")
@OrderColumn(name="order")
private List<Wish> wishes;

“order”,Hibernate只是跳过了这个类。请检查您的用户定义名称!:)
干杯,马克

mnemlml8

mnemlml82#

回答您的附带问题(可以使用什么检测来查看Hibernate正在生成什么以及哪些错误?)
你可以org.hibernate.tool.hbm2ddl.SchemaExport来生成你的表。

AnnotationConfiguration conf = (new AnnotationConfiguration()).configure();
new SchemaExport(conf).create(showHql, run);

第一个参数允许您查看此命令生成的HQL(CREATE TABLE s等)。第二个是它是否应该实际执行任何修改(即false = dry-run)。
因此,使用(true, false)运行它将向您展示Hibernate将对表执行的操作,而无需更改任何内容。

ghg1uchk

ghg1uchk3#

@Entity上的name attribute不是您要用于此目的的。使用@Table注解:

@Entity
@Table(name="RevisionT")
public class Revision {
q43xntqr

q43xntqr4#

对我来说,这是columnDefinition中的语法错误。很容易被调试日志检测到。

vq8itlhq

vq8itlhq5#

这是由于列名与您的sql保留字匹配。您可以尝试更改列的名称。我遇到过类似的问题。

nzkunb0c

nzkunb0c6#

也许你使用了错误的注解。有一次我不小心用@org.hibernate.annotations.Entity而不是@javax.persistence.Entity注解了一个实体,Hibernate跳过了它。

nkoocmlb

nkoocmlb7#

将hibernate.show_sql配置属性设置为true,并查看Hibernate是否生成了创建表代码。如果是这样,请将create语句复制到数据库客户机(ui或命令行)中,查看数据库是否返回错误。
对我来说,错误是不明显的,直到我这样做。
我使用了字段名'condition',这是一个保留的MySQL单词。所以请检查您的字段名称...

相关问题