2009-09-03 54 views
4

我注释了一堆POJO,所以JPA可以使用它们在Hibernate中创建表。看起来,除了一个名为“Revision”的非常中心的表之外,所有表格都被创建。 Revision类有一个@Entity(name="RevisionT")注释,所以它将被重命名为RevisionT,因此不会与MySQL(目标数据库)中的任何保留字发生冲突。表未由Hibernate创建

我删除整个数据库,重新创建它并基本打开和关闭JPA会话。所有的表似乎都没有问题重新创建。

为什么创建的模式中缺少单个表?可以使用哪些工具来查看Hibernate正在生成的内容以及哪些错误?

谢谢。

更新:我试图创建一个德比DB,它是成功的。但是,其中一个字段的名称是“索引”。我使用@org.hibernate.annotations.IndexColumn来将名称指定为保留字以外的名称。但是,该列在创建时始终称为“索引”。

下面是可疑注释的示例。


    @ManyToOne 
    @JoinColumn(name="MasterTopID") 
    @IndexColumn(name="Cx3tHApe") 
    protected MasterTop masterTop; 

而不是创建MasterTop.Cx3tHApe作为一个领域的,它创造MasterTop.Index。为什么名称被忽略?

回答

5

回答您的问题边(什么仪器可以用来看看Hibernate的是生产,哪些错误?)

可以org.hibernate.tool.hbm2ddl.SchemaExport生成你的表。

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

的第一个参数允许你看到哪个HQL该命令生成(CREATE TABLE小号等)。第二个是它是否应该实际进行任何修改(即false =干运行)。

因此,使用(true, false)运行它会向您显示Hibernate将对您的表执行的操作,而不会更改任何内容。

+0

这个帮助非常大!我发现有还有一个名为“Index”的列被创建,进一步调查显示模式的@OneToMany一侧也有@IndexColumn(name =“Index”),Hibernate忽略了@ManyToOne上的@IndexColumn,我仍然想知道为什么没有输出从休眠。哦,它的工作! – User1 2009-09-04 16:42:16

+1

哈哈,我很高兴,帮助:) – 2009-09-04 19:34:06

2

name attribute on @Entity是不是你想用于这个目的。改用@Table注释:

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

该死的你打败了我:P – 2009-09-03 23:55:37

+0

好主意。它没有帮助。 :( – User1 2009-09-04 14:18:23

0

也许你使用的是错误的注解。一旦我意外注释了一个实体@org.hibernate.annotations.Entity而不是@javax.persistence.Entity,而Hibernate只是跳过了它。

+0

我正在使用@ javax.persistence.Entity。但是,我确实有一个org.hibernate.annotations.IndexColumn。混合注释会导致问题吗? – User1 2009-09-04 14:19:44

+0

不,绝对不是。 – 2009-09-04 15:27:33

5

如果这可以帮助任何人,这发生在我身上的今天,它原来我是用我的实体定义的保留字:在这种情况下

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

“秩序”和Hibernate刚刚跳过此类。所以检查你的用户定义的名字! :)

干杯, 马克

+0

谢谢你节省了我的时间:) – Smrita 2014-06-11 06:05:41

1

正是由于列名与底层数据库的SQL保留字.....通过改变列名匹配尝试.....我不得不面临同样的问题改变了它的名字。

1

对我来说这是一个语法错误columnDefinition。通过调试日志轻松检测。

0

将hibernate.show_sql配置属性设置为true,看看Hibernate是否生成了创建表代码。如果是这样,请将create语句复制到数据库客户端(ui或命令行)中,并查看数据库是否返回错误。

对我来说,直到我这样做的错误并不明显。

我使用了字段名'condition',它是一个保留的MySQL字。 因此,检查您的字段名称...