2013-03-07 85 views
7

我最近試圖介紹一些我的hibernate映射實體的接口,但無法弄清楚如何配置映射。不使用註釋參數的Hibernate接口映射「targetEntity」

當我使用的接口沒有任何進一步聲明,我總是得到以下異常:

org.hibernate.MappingException: Could not determine type for: ...MyInterface 

然後我發現一切正常,當我明確定義targetEntity:

@OneToOne(targetEntity=InterfaceImpl.class) 
    private MyInterface myInterface; 

不幸的是,這個解決方案在我的情況下不起作用:我不能通過註釋來定義targetEntity,因爲我想將這個類提取到一個不包含甚至不知道接口的最終實現的公共外部庫。

那麼是否有另一種方法來聲明應該使用哪個實現,以便我可以在提取的庫之外使用? enter image description here

回答

1

在抽象@MappedSupperclass中定義您的映射合約,然後在實現類中用@AssociationOverride覆蓋它。

+0

好主意,技術上。不幸的是,我真的需要接口。抽象超類不會這樣做,因爲我需要多繼承來使它們適合我的需求。用戶(見上面的例子)應該能夠實現多個接口。例如,他既是博客文章的作者,也是評論的作者。我沒有提到這一點。抱歉。 – Pumuckline 2013-03-11 16:04:48

1

我不知道的東西與Hibernate的註解是如何工作的,但我沒有描述here

見最後發表的一個相當詳盡的解釋類似的東西。

基本的需求是相似的,因爲我們在hibernate映射文件中指定了接口,實現是大多數在運行時用javassist創建的類(它們不存在編譯時)。

你需要的是代碼,可以在運行時解決從接口,反之亦然實現類和使用Hibernate的tuplizer /實例化的合同作爲擴展點,以允許Hibernate

(一)創建實施(b)在需要將實體(實現實例)存儲到數據庫時,定位hibernate映射元數據。