2016-04-14 60 views
0

我希望有人能幫我弄清楚我在用hibernate時遇到的一個問題。休眠與接口的關聯

我正在開發一個可以開發不同類型的實體的計費系統。這些實體實現了「Invoicable」界面。

在我的發票類我有這條線

@ManyToOne(fetch = FetchType.EAGER) 
private Invoiceable responsibleEntity; 

的開票界面看起來像這樣

@MappedSuperclass 
public interface Invoiceable 
{ 
// Name to display as entity responsible 
String getInvoiceOwnerName(); 

// Get email address to send invoice 
String getInvoiceOwnerEmail(); 
} 

我得到一個例外,當我運行這個

組織。 hibernate.AnnotationException:@OneToOne或@ManyToOne在models.Invoice.responsibleEntity引用一個未知實體:interfaces.Invoiceable

我試過用Google搜索和閱讀一些類似的帖子,但我什麼都不能上班。 hibernate是否支持這種類型的映射?

謝謝

回答

1

你必須在Hibernate的方式使用繼承來做到這一點。詳細信息可以在 - >Hibernate Inheritance Doc

附加信息: Hibernate無法將類型連接在一起,其中沒有數據庫表位於其後面。這對你意味着什麼。 MappedSuperclasses沒有表格,所以沒有什麼可以連接在一起。所以這是無法運作的。最重要的是牢記在心。當您請求讀取所有父對象時。他應該加入哪些表格?這就是hibernate繼承系統發揮作用的原因。您必須將界面更改爲普通類。這不應該是一個大問題。現在選擇您選擇的繼承策略。他們每個人都有自己的優點和缺點。請閱讀文檔以瞭解哪種最適合您的情況。

以下是帶有Invoice類的單表方法的示例。

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
    name="invoiceType", 
    discriminatorType=DiscriminatorType.STRING 
) 
@DiscriminatorValue("Invoice") 
public class Invoiceable { ... } 

@Entity 
@DiscriminatorValue("CustomInvoice") 
public class CustomInvoice extends Invoiceable { ... } 
+1

您能否總結這裏的關鍵點?堆棧溢出通常不會歡迎只不過是鏈接到另一個資源的答案。此外,鏈接有時會中斷。 –

+0

@ mh-dev我確實讀過了這篇文檔,但我看不到如何使用界面。它實際上表示那裏的接口不支持註釋。由於我的實體不是來自同一個基類,我不明白我能做到這一點。我必須找到另一種方式。 – FMC

+0

我擴展了答案,但請記住,繼承策略會對性能產生影響。所以請仔細閱讀文檔。 –