我一直在閱讀很多有關JPA映射的SO問題和博客文章和文檔,但似乎沒有清楚地解決我的情況(這讓我感到驚訝,因爲我確信我不是第一個想要映射像這樣的類層次結構)。是否可以映射(JPA)在抽象超類中使用泛型的Java類型層次結構?
我有一個很好的,乾淨設計的對象模型,我需要通過JPA映射。它如下
public abstract class BaseEntity<T extends BaseEntity> {
private Integer id;
private List<T> children;
}
public class ConcreteEntity1 extends BaseEntity<ConcreteEntity2> {
private String value;
}
public class ConcreteEntity2 extends BaseEntity{
private String foo;
}
我似乎無法得到這個地圖。我已經得到的最接近的是這樣的(我使用XML映射現在,雖然我也有試過註釋):
<mapped-superclass class="com.me.datamodel.BaseEntity" access="FIELD">
<attributes>
<id name="id">
<column name="auto_id" nullable="false"/>
<generated-value strategy="IDENTITY"/>
</id>
</attributes>
</mapped-superclass>
<entity class="com.me.datamodel.ConcreteEntity1" access="FIELD">
<attributes>
<basic name="value" />
<one-to-many name="children" fetch="EAGER" mapped-by="media">
<cascade><cascade-all /></cascade>
</one-to-many>
</attributes>
</entity>
<entity class="com.me.datamodel.ConcreteEntity2" access="FIELD">
<attributes>
<basic name="foo" />
</attributes>
</entity>
的問題,這是JPA抱怨的children
在ConcreteEntity1
映射。它聲稱children
(BaseEntity)的目標實體不是實體。那麼,這是正確的,'BaseEntity'不是一個實體。但children
的實際類型是而不是BaseEntity
而是ConcreteEntity2
(如ConcreteEntity1
的類型參數所聲明的)。
那麼如何映射這樣的對象模型呢?我已經嘗試了很多變體,但都沒有工作(它們在實體管理器的初始化過程中都失敗了)。
對不起,這是一個錯字。我修正了代碼以正確顯示'ConreteEntity1'和'ConcreteEntity2'都擴展了'BaseEntity'。 –
一旦我分配了它,我無法撤消,因此我只能等到所有集成測試都顯示此映射沒有創建任何問題。 –