Witam. Próbuje zrobić w javie prosty cms. Potrzebuję do tego encje typu:
@Entity
class Page {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long id;
@Required
public String name;
@ManyToOne(fetch=FetchType.LAZY)
public Page parent;
}
Dodatkowo napisałem metodę serializującą na obiekt json, dzięku której mogę utworzyć drzewo z takich danych.
Ze względu na to, że danych hierarchicznych będę mieć sporo (np. role, foldery, uprawnienia, itd.), chcąc nie powtarzać kodu (zwłaszcza do generowania drzew w formacie json) postanowiłem rozszerzyć moje podstawowe encje przez Hierarchiczną Encję Generyczną
@MappedSuperclass
public abstract class Generic<T extends Generic> {
@Transient
public Class<T> entityClass;
Generic() {
entityClass = ((Class) ((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long id;
@ManyToOne(cascade = CascadeType.MERGE)
@Constraints.Required
public User creationUser;
@Constraints.Required
@MappedSuperclass
public abstract class GenericDictionary<T extends Generic<T>> extends Generic<T> {
@Required
public String name;
@Required
public boolean active;
@MappedSuperclass
public class GenericHierarchicalDictionary<T extends Generic<T>> extends GenericDictionary<T> {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="parent_id")
public GenericHierarchicalDictionary<T> parent;
public String prepareJsonTree() {}
Niestety mam problem z mapowaniem @ManyToOne. Klasa GenericHierarchicalDictionary nie jest encją, więc nie mogę jej podać w relacji. Błąd z konsoli:
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on models.Unit.parent references an unknown entity: models.GenericHierarchicalDictionary
Cały stack trace:
play.api.UnexpectedException: Unexpected exception[PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to build 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 build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915) ~[hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890) ~[hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57) ~[hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
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]
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:109) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1514) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1435) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1340) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1729) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94) ~[hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
Pytałem także na stackoverflow. Ale póki co brak odpowiedzi:
http://stackoverflow.com/questions/27104464/java-hibernate-jpa-how-to-create-dynamic-generic-entity-that-is-self-related
http://stackoverflow.com/questions/27101716/apply-generic-class-mappedsuperclass-as-targetentity-error-manytoone-on-model
Dajcie mi znać czy też spotkaliście się z takim problemem. Jak sobie z nim poradzić?