2014-11-24 32 views
0

我有擴展其他泛型類的泛型類。他們全部是@MappedSuperclass。所以他們在數據庫中沒有自己的表格。它們也是抽象的,所以它們沒有任何物體。他們只是骷髏對我的實體@Entity將泛型類@MappedSuperclass應用爲targetEntity.Error:@ManyToOne on models.Unit.parent引用未知實體:models.GenericHierarchic

我的繼承結構:

Generic -> GenericDictionary -> GenericHierarchicalDictionary -> Unit

如果單位是@Entity級別且對象。

@Entity 
public class Unit extends GenericHierarchicalDictionary<Unit> {} 

單位實體有層次結構這意味着實體關係到自身,但我使用的是抽象類(@MappedSuperclass),所以我想在抽象類動態定義它:

My 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; 

但是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一個Java類@Entity註解,但它不是我想有什麼。

我想從實體的上下文中動態聲明@ManyToOne targetEntity。

我該如何實現這一目標?請給我一些幫助。

回答

-1

我知道這是一個遲到的答覆,但如果仍然需要解決方案在這裏。

此問題是因爲GenericHierarchicalDictionary是一個抽象類。 Hibernate不知道屬性引用了什麼實體類型。相反,你需要做的是使用繼承類作爲類型(在這種情況下,單位)。

所以屬性是: -

公衆作爲其父;

而不是

public GenericHierarchicalDictionary parent;

這就是我在我們的最後解決同樣的問題。希望這可以幫助!

+0

我會檢查它,但現在我切換到春天了,它就可以工作在箱子外面:d。但謝謝你的回答。 – masterdany88 2015-03-25 14:16:27

+0

噢,好的。你能不能讓我知道春天它是如何開箱的?我正在使用春天,但是我按照上面提到的方式進行了操作。 – fretswitch 2015-03-26 15:35:24

+0

檢查我的答案。希望我幫忙; D – masterdany88 2015-03-26 19:22:53

0

這裏是我的分層通用類(abstract,映射超類)春季實施:

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 how to create dynamic generic entity that is self related

相關問題