我有,我想使用JPA/Hibernate的數據庫堅持的Visitable元素列表的管理器類:如何持續使用JPA 2.0的子類型列表?
@Entity
class Elements {
void accept(Visitor v) {...}
@? List<Visitable> elements; // or List<AbstractElement>
}
@? class AbstractElement implements Visitable {}
@Entity class Element1 extends AbstractElement {}
@Entity class Element2 extends AbstractElement {}
class ElementDAO {
void saveElements(Elements e, EntityManager em) {
em.persist(e);
}
}
我曾嘗試多種方法。我曾嘗試將AbstractElement標記爲@MappedSuperclass,但後來Hibernate無法弄清楚正確的Visitable類型,並且不會讓我用@OneToMany(targetEntity = AbstractElement.class)標記它。我試圖改變List來包含AbstractElement,但Hibernate抱怨說它不能實例化一個抽象類。我也嘗試在AbstractElement類上使用TABLE_PER_CLASS繼承策略,並獲得相同的「無法實例化」錯誤。
我能做些什麼來解決這個問題嗎?這是可行的嗎?
我在這個網站上搜索了很多類似的問題,處理jpa和繼承,但沒有任何的建議工作。
更新: 所以它看起來像問題不是繼承或抽象類本身的方法,但事實上,我試圖使用EntityManager :: merge()而不是EntityManager :: persist() )。我認爲這與合併複製實體有關。
因此,鑑於這些新知識,我必須承認合併不能與抽象類的集合一起工作嗎?或者有什麼方法可以添加一個hibernate可以調用的複製構造函數?
所以,我想這(正如我上面說的)前面,但想通我應該再次嘗試。當我這樣做時,我得到一個InstantiationException:異常在線程「main」javax.persistence.PersistenceException:org.hibernate.InstantiationException:無法實例化抽象類或接口:元素 at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java :1215) – thebamaman 2012-02-16 16:19:37
請參閱原始問題中的新更新註釋,因爲如果使用persist(),您的回答是正確的,但是存在merge()問題。 – thebamaman 2012-02-16 16:29:05
如果你有'merge()'的問題,那麼你應該(也)發佈該代碼...另外,查看'@ OneToMany'的'CascadeType'註釋可能有幫助。 – CoSeeWolf 2012-02-17 09:28:19