1

創建2個實體的正確方法是,其中1是另一個的父實體?例如,我們有以下2個表:Hibernate中的實體層次結構

Email_Outbox 
------------ 
Id 
Email_Id 
Date_Sent 

Email_Outbox_Schedule 
--------------------- 
Id 
Email_Id 
Date_Sent 
Date_to_Send 

很簡單,我們在EmailOutbox馬上出門,在中EmailOutboxSchedule指定日期外出郵件和電子郵件。理想情況下,這是Java中的類層次結構,其中EmailOutboxSchedule擴展爲EmailOutbox。那麼我們只需要指定1個額外的字段,即dateToSend,並且可以利用典型的對象層次結構特徵。用hibernate做這件事有什麼問題嗎?我是否需要以任何特殊方式註釋這兩個實體?

回答

0

通過this document,我看到的解決方案是對父類Email_Outbox使用@MappedSuperclass,然後有兩個子類Scheduled_Email_Outbox和Immediate_Email_Outbox。

Immediate_Email_Outbox除了@Entity註釋外都是空的。我承認,一個空的班級幾乎沒有優雅,但它似乎是行得通的。 (無論如何,冬眠和優雅有點不兼容。)

+0

它將工作,但不會代表所需的層次結構。但是這是一個合理的解決方案(比如只有可以爲空的計劃列才合理)。 –

+0

非常有趣的評論關於冬眠和優雅:)。這似乎是最有意義的。在我看來,這絕對比有一個可以爲空的時間表列更好。 –

2

您可能需要閱讀有關Hibernate inheritance mapping。然而,從邏輯上講,我不會購買那個時間表擴展收件箱。這聽起來更像是時間表是個人信息的屬性。所以可能在單個消息實體上只有可空的屬性date to send

+1

+1「不是繼承層次結構」 –

+0

我可以使dateToSend爲需要馬上熄滅的郵件,但我寧願有單獨的表和類。我不同意EmailOutboxSchedule是否是一個子類EmailOutbox,但是我更加好奇在hibernate中表示對象層次結構的合適機制,而不是這個特定的例子。 Hibernate繼承映射的鏈接是JIRA問題,這似乎不涉及這個..我搜索和手冊的第10章描述了繼承映射,但我想要一些更簡單的東西,2個獨立的表 - 1個類層次結構。 –

+0

抱歉,錯誤的鏈接,必須卡在我的標籤上的剪貼板。糾正。如果你真的想使用層次結構,並且你想使用你描述的表,那麼你可以考慮「每個具體類的表」。 –