表不是由Hibernate创建的

时间:2009-09-03 23:44:26

标签: java mysql hibernate jpa

我注释了一堆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 个答案:

答案 0 :(得分:5)

回答你的问题(可以用什么工具来看看Hibernate产生了什么以及哪些错误?)

您可org.hibernate.tool.hbm2ddl.SchemaExport生成表格。

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

第一个参数允许您查看此命令生成的HQL(CREATE TABLE等)。第二个是它是否应该实际执行任何修改(即假=干运行)。

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

答案 1 :(得分:5)

如果这有助于任何人,今天发生在我身上,事实证明我在实体定义中使用了保留字:

@OneToMany(mappedBy="list")
@OrderColumn(name="order")
private List<Wish> wishes;
在这种情况下,

“order”,而Hibernate刚跳过这个类。所以检查用户定义的名称! :)

干杯, 标记

答案 2 :(得分:2)

@Entity上的{p> name attribute不是您想要用于此目的的。请改用@Table注释:

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

答案 3 :(得分:1)

这是由于列名与您的基础数据库sql保留字匹配.....尝试通过更改列的名称.....我通过更改它确实起作用的名称遇到了同样的问题。

答案 4 :(得分:1)

对我来说,这是 columnDefinition 中的语法错误。可以通过调试日志轻松检测到。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

对我来说,错误在我这样做之前并不明显。

我使用了字段名称&#39; condition&#39;这是一个保留的MySQL字。 因此,请检查您的字段名称......