我正在一個已經成長的項目中工作,所以我將無法更改任何使用過的框架或庫的任何版本。@任何:不支持
其實,我有一個特殊的情況,我設法解決與兩個實體和@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
可以的鍵入A
或B
。我所做的是這樣的:
@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中失去了一些我還不知道的特殊功能,所以我現在對此表示歡迎,並且感謝任何可能指向正確方向的建議。
爲什麼你需要首先放置?對A的引用可以指向B,而不需要做任何事情,因爲B擴展爲A. –
那麼,那會給我帶來兩個A元素,我必須弄清楚每種...現在我想知道,如果A具有ID,因爲它不會爲B對象帶來A-only字段,還是會直接執行'A object1 = new B()'?現在你提到它了......我覺得我在這裏是一種「過度防禦」...... – Gamb
這兩個字段的類型都是IA,所以你不知道它是哪種類型(A或B)。 B擴展了A,所以B **是** A.雖然變量的類型是IA,但是對象的實際類型可以是A或B.Hibernate將填充具有適當具體類型的實例的引用all通過它自己。 –