我注释了一堆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
。为什么忽略这个名字?
答案 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字。 因此,请检查您的字段名称......