2013-02-08 88 views
2

我有這2類:Java泛型「反向關係」(和JPA)

@Entity 
public abstract class Compound { 


    @OneToMany(fetch = FetchType.EAGER, mappedBy="compound", 
     targetEntity=Containable.class, cascade = CascadeType.ALL)  
    private Set<Containable> containables = new HashSet<>(); 
} 

@Entity 
public abstract class Containable {  

    @ManyToOne(optional=true, fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private Compound compound; 
} 

我想在一個類型安全的方式實現的是,化合物的具體實施只接受特定的實現可容納的,反之亦然。

我該如何做到這一點?

編輯:

我已經從asenovm的解決方案,只是想仔細檢查它實際上是正確的。

我的後續問題是,如果我有class Compound<T extends Containable>class Containable<T extends Compound> Containable和Compound是原始類型還是我得到錯誤?因爲在class Compound<T extends Containable> T實際上是一個Containable而不是其他任何東西。

回答

2

也許這樣的事情?

@Entity 
public abstract class Compound<T extends Containable> { 


    @OneToMany(fetch = FetchType.EAGER, mappedBy="compound", 
     targetEntity=Containable.class, cascade = CascadeType.ALL)  
    private Set<T> containables = new HashSet<T>(); 

} 

@Entity 
public abstract class Containable<T extends Compound> {  

    @ManyToOne(optional=true, fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private T compound; 
} 
+0

這也是我的第一個想法,但它不適用於每個類的JPA(Hibernate)和Table。 - >在爲化合物A插入一個可容納對象時出現外鍵約束違規,它說:「表中沒有記錄,其ID爲xyz的化合物B」。 – 2013-02-09 07:57:20

+0

並且用'ChemicalCompound 'Compound的一種方法,'compound.getCompositions()'現在似乎返回List而不是列表。 (不兼容的類型編譯錯誤)。對我沒有意義... – 2013-02-09 08:32:51