Java 如何使用hibernate通过向JPA中现有的持久化单元添加带注释的类来更新模式?
环境:JPA2.0、Hibernate3.6,在war文件中(使用JSF2.0,在JBoss6上,等等)。Java 如何使用hibernate通过向JPA中现有的持久化单元添加带注释的类来更新模式?,java,hibernate,jpa-2.0,java-ee-6,Java,Hibernate,Jpa 2.0,Java Ee 6,环境:JPA2.0、Hibernate3.6,在war文件中(使用JSF2.0,在JBoss6上,等等)。 我希望通过使用hibernate向JPA中现有的持久化单元添加带注释的类来更新模式。这就是我试图做的: public void updateConfiguration() { // load classes Ejb3Configuration ejb3Configuration = new Ejb3Configuration(); ejb3Configuration
我希望通过使用hibernate向JPA中现有的持久化单元添加带注释的类来更新模式。这就是我试图做的:
public void updateConfiguration() {
// load classes
Ejb3Configuration ejb3Configuration = new Ejb3Configuration();
ejb3Configuration = ejb3Configuration.configure("existingPU", null);
loadModel(ejb3Configuration);
updateSchema(ejb3Configuration.getHibernateConfiguration());
}
private void updateSchema(Configuration cfg) {
SchemaUpdate schemaUpdate = new SchemaUpdate(cfg);
schemaUpdate.execute(true, true);
}
private void loadModel(Ejb3Configuration ejb3Configuration) {
for (Object _object : objectList) {
ejb3Configuration.addAnnotatedClass(_object.getClass());
}
}
existingPU
通过使用persistence.xml等的正常JPA方式加载。更新WEB-INF/classes
中实体的模式,该部分代码库工作正常。现在,objectList
中的新类从WEB-INF/classes
扩展了一个@MappedSuperclass
,该类具有
@MappedSuperclass
public abstract class OwnerHolder implements Serializable {
private User owner;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "fk_owner_id")
public User getOwner() {
return owner;
}
public void setOwner(User owner) {
this.owner= owner;
}
}
这个类还通过WEB-INF/classes中的类进行扩展,代码运行良好。我得到的错误如下:
13:36:45,494 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] could not complete schema update: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.myproject.external.model.PurchaseOrder.owner references an unknown entity: com.myproject.model.User
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:107) [:3.6.0.Final]
at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1550) [:3.6.0.Final]
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1473) [:3.6.0.Final]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1389) [:3.6.0.Final]
at org.hibernate.cfg.Configuration.generateSchemaUpdateScript(Configuration.java:1160) [:3.6.0.Final]
at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:187) [:3.6.0.Final]
at com.myproject.MyConfiguration.updateSchema(MyConfiguration.java:43) [:]
objectList
是放置在WEB-INF/lib中的jar文件中的类列表
你能帮我吗?检查用户类的声明中是否有@Entity注释。谢谢@peshkira。我已经检查了你提到的所有检查点。一切都很好。就注释而言,它们始终位于get属性上,包括中提到的
@Id
。同样如前所述,WEB-INF/classes
中的模型代码工作正常。在WEB-INF/classes
中,大约有20个类扩展了OwnerHolder
,而且都很好。我的推论是:当我尝试向现有pu
添加一个新的注释类时,旧的类没有进一步的进展:我在loadModel(Ejb3Configuration)
中重新加载了所有实体,包括之前在启动时加载的实体,并且工作正常。这基本上意味着我加载的Ejb3Configuration
中没有启动时加载的实体。知道为什么会这样吗?