将generics类@MappedSuperclass应用为targetEntity.Error:模型上的@ManyToOne.Unit.parent引用未知实体:models.GenericHierarchic

我有扩展其他generics类的generics类。 所有这些都是@MappedSuperclass 。 所以他们在数据库中没有自己的表。 它们也是抽象的,所以它们没有任何物体。 它们只是我的实体@Entity骨架

我的inheritance结构:

Generic -> GenericDictionary -> GenericHierarchicalDictionary -> Unit

Unit是@Entity类并且有对象。

 @Entity public class Unit extends GenericHierarchicalDictionary {} 

单元实体具有层次结构 ,这意味着实体与自身有关系,但我正在使用抽象类( @MappedSuperclass ),所以我想在该抽象类中动态定义它:

我的GenericHierarchicalDictionary:

 @MappedSuperclass public abstract class GenericHierarchicalDictionary<T extends Generic> extends GenericDictionary { @Required @ManyToOne(targetEntity = GenericHierarchicalDictionary.class, fetch=FetchType.LAZY, cascade = {CascadeType.ALL}) @JoinColumn(name="parent_id") public GenericHierarchicalDictionary parent; 

但id dosnt工作。 我收到一个错误:

 play.api.UnexpectedException: Unexpected exception[PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to configure EntityManagerFactory] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:148) ~[play_2.10.jar:2.2.4] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.2.4] at scala.Option.map(Option.scala:145) ~[scala-library.jar:na] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.2.4] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:110) ~[play_2.10.jar:2.2.4] at scala.util.Success.flatMap(Try.scala:200) ~[scala-library.jar:na] Caused by: javax.persistence.PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to configure EntityManagerFactory at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:378) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final] at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final] at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) ~[hibernate-jpa-2.0-api.jar:1.0.1.Final] at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) ~[hibernate-jpa-2.0-api.jar:1.0.1.Final] at play.db.jpa.JPAPlugin.onStart(JPAPlugin.java:35) ~[play-java-jpa_2.10.jar:2.2.4] at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:88) ~[play_2.10.jar:2.2.4] Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on models.Unit.parent references an unknown entity: models.GenericHierarchicalDictionary at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:107) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1580) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1503) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1419) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1519) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final] 

如果我纠正错误,我应该为targetEntity分配一个带有@Entity注释的java类,但这不是我想要的。

我想从Entity的上下文动态声明@ManyToOne targetEntity。

我怎么能得到这个? 请给我一些帮助。

这是我在spring中实现的分层generics类(抽象,映射超类):

 import java.util.List; import javax.persistence.CascadeType; import javax.persistence.FetchType; import javax.persistence.ManyToOne; import javax.persistence.MappedSuperclass; import javax.persistence.OneToMany; @MappedSuperclass public abstract class GenericHierarchicalModel> extends GenericModel { private String name; @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) private T parent; @OneToMany(mappedBy = "parent") private List children; public String getName() {return name;} public void setName(String name) {this.name = name;} public T getParent() {return parent;} public void setParent(T parent) {this.parent = parent;} public List getChildren() {return children;} public void setChildren(List children) {this.children = children;} public GenericHierarchicalModel() { super(); } public GenericHierarchicalModel(Long id) { super(id); } public GenericHierarchicalModel(Long id, String name) { super(id); this.name = name; } public GenericHierarchicalModel(Long id, String name, List children) { super(id); this.name = name; this.children = children; } 

做好所有工作。 我在它的类上有工作实现。 希望我会帮忙。

查看这篇文章: Java hibernate / jpa如何创建与自身相关的动态generics实体

我知道这是一个迟到的回复,但如果仍然需要一个解决方案。

这个问题是因为GenericHierarchicalDictionary是一个抽象类。 Hibernate不知道属性引用的实体类型。 相反,您需要做的是使用inheritance类作为类型(在本例中为Unit)。

所以该物业将是: –

公共T父母;

代替

public GenericHierarchicalDictionary parent;

这就是我在最后解决同样问题的方法。 希望这可以帮助!