2010-05-17 59 views
2

在我的數據庫中有兩個三個表。第一個,表摘要:,持有三列休眠時每個子類和每個層次結構的混合表

id, type, someText 

此表包含抽象類抽象所有的抽象信息。現在,這兩個表CONCRETEONECONCRETETWO包含具體的類concreteOneconcreteTwo的所有信息。現在我知道我可以使用hibernate的table per子類策略來創建一個帶繼承的映射。但是,因爲我有一列標誌着具體實現的類型,是否有可能創建一些混合行爲,如帶子標識符的每個子類策略的表?

+0

你爲什麼需要鑑別器?你爲什麼不用簡單的「每個子類的表」去? – cherouvim 2010-05-17 06:58:37

+0

也許這可能會降低性能開銷,因爲理論上在查詢抽象類時可以避免外連接。 – 2010-05-17 08:04:15

回答

2

應根據數據庫設計選擇Hibernate繼承映射策略。

如果無法更改數據庫設計,那麼堅持使用當前數據庫設計的最佳策略。即每個子類策略的表。

如果您可以更改數據庫設計,請先忘掉Hibernate,重點關注哪個數據庫表設計更適合您的應用程序。 需要考慮的一些因素, a)如何獲取/使用數據?可以說,如果大部分時間,邏輯不關心區分CONCRETEONE和CONCRETETWO,那麼沒有意義的子表。 b)CONCRETEONE和CONCRETETWO需要添加多少添加色譜柱? 如果你有許多專門針對子表的列,那麼「Table per class herarchy」不是一個好主意。 c)特定於子表的列不應該是「NOT-NULL」。

希望這會有所幫助。

+0

a)也許你是對的,並且它很少會發生,我想查詢抽象類b)許多額外的列,因此我問c)好吧 我看看http://www.javalobby。 org/java/forums/t18300.html,也許這會幫助我 – 2010-05-17 08:40:53