2012-11-23 40 views
-1

我正在一個已經成長的項目中工作,所以我將無法更改任何使用過的框架或庫的任何版本。@任何:不支持

其實,我有一個特殊的情況,我設法解決與兩個實體和@Inheritance,@DiscriminatorColumn@DiscriminatorValue。現在,我有一個實體在繼承這兩個類的引用,就像這樣:

@Entity 
//Other annotations 
public class A implements IA { 
    //Class body 
} 

@Entity 
//Other annotations 
public class B extends A implements IB { //Note: `IB` extends `IA`. 
    //Class body 
} 

@Entity 
//Other annotations 
public class Container { 
    private IA object1; 
    private IA object2; 
} 

這裏的問題是,我試圖用@Any標註,因爲無論object1和/或object2可以的鍵入AB。我所做的是這樣的:

@Any([email protected](name="objectOneType", length=3),fetch=FetchType.EAGER) 
@AnyMetaDef(idType="long",metaType="string", metaValues={ 
     @MetaValue(targetEntity=A.class, value="A"), 
     @MetaValue(targetEntity=B.class, value="B") 
    } 
) 
@JoinColumn(name = "relatedObjectId") 
private IA object1; 

如前所述here,Hibernate的@Any註釋族在JPA 2中沒有對應和,因爲我不能切換到Hibernate 4.1,我堅持在這裏試圖找出一種使它工作的方式,或者我應該怎麼做來解決它。

「不那麼優雅」的方式是創建一個新實體並將字段從A複製到B,擦除繼承並修復特定情況。

也許,我在JPA中失去了一些我還不知道的特殊功能,所以我現在對此表示歡迎,並且感謝任何可能指向正確方向的建議。

+0

爲什麼你需要首先放置?對A的引用可以指向B,而不需要做任何事情,因爲B擴展爲A. –

+0

那麼,那會給我帶來兩個A元素,我必須弄清楚每種...現在我想知道,如果A具有ID,因爲它不會爲B對象帶來A-only字段,還是會直接執行'A object1 = new B()'?現在你提到它了......我覺得我在這裏是一種「過度防禦」...... – Gamb

+1

這兩個字段的類型都是IA,所以你不知道它是哪種類型(A或B)。 B擴展了A,所以B **是** A.雖然變量的類型是IA,但是對象的實際類型可以是A或B.Hibernate將填充具有適當具體類型的實例的引用all通過它自己。 –

回答

2

您不需要任何@Any註釋。 B擴展A,所以B is一個A.所以下面就足夠了:(假設關聯是一個多對一它也可以是一個OneToOne)

public class Container { 
    @ManyToOne 
    private A object1; 

    @ManyToOne 
    private A object2; 
} 

Hibernate會找出具體類型的這兩個對象都是自己的,並且將用A或B的實例初始化object1和object2。