Примените универсальный класс @MappedSuperclass как targetEntity.Error: @ManyToOne для models.Unit.parent ссылается на неизвестную сущность: models.GenericHierarchic
У меня есть универсальный класс, который расширяет другой универсальный класс. Все они @MappedSuperclass
, Таким образом, у них нет собственной таблицы в базе данных. Они также абстрактны, поэтому у них нет никаких объектов. Они просто скелет для моих сущностей @Entity
Моя структура наследования:
Generic -> GenericDictionary -> GenericHierarchicalDictionary -> Unit
Где блок @Entity
класс и объекты.
@Entity
public class Unit extends GenericHierarchicalDictionary<Unit> {}
Единица сущности имеет иерархическую структуру, что означает, что сущность имеет отношение к себе, но я использую абстрактный класс (@MappedSuperclass
) для этого, поэтому я хотел бы определить его динамически в этом абстрактном классе:
Мой GenericHierarchicalDictionary:
@MappedSuperclass
public abstract class GenericHierarchicalDictionary<T extends Generic<T>> extends GenericDictionary<T> {
@Required
@ManyToOne(targetEntity = GenericHierarchicalDictionary.class, fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinColumn(name="parent_id")
public GenericHierarchicalDictionary<T> parent;
Но я не работаю. Я получаю ошибку:
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 класс Java с @Entity
аннотации, но это не то, что я хотел бы иметь.
Я хотел бы, чтобы @ManyToOne targetEntity объявлялся динамически из контекста Entity.
Как я могу достичь этого? Пожалуйста, помогите мне.
2 ответа
Вот мой иерархический обобщенный класс (абстрактный, сопоставленный суперкласс), реализованный весной:
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<T extends GenericHierarchicalModel<T>> extends GenericModel<T> {
private String name;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private T parent;
@OneToMany(mappedBy = "parent")
private List<T> 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<T> getChildren() {return children;}
public void setChildren(List<T> 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<T> children) {
super(id);
this.name = name;
this.children = children;
}
Делай всю работу. У меня есть рабочая база реализации по этому классу. Надеюсь я помогу.
Посмотрите этот пост: Java Hibernate/ JPA, как создать динамический универсальный объект, который сам по себе
Я знаю, что это поздний ответ, но если решение все еще требуется, здесь идет.
Эта проблема связана с тем, что GenericHierarchicalDictionary является абстрактным классом. Hibernate не знает, на какой тип сущности ссылается свойство. Вместо этого вам нужно использовать наследующий класс в качестве типа (в данном случае Unit).
Таким образом, свойство будет:
общедоступный родительский элемент;
вместо
public GenericHierarchicalDictionary parent;
Так я решил ту же проблему с нашей стороны. Надеюсь это поможет!