2014-09-05 182 views
0

在我的java中,我有一個泛型類(可以是抽象或非抽象的方式,但不映射到數據庫中的表)。它有一個或多個變量,這對每個類都是通用的。示例:在Hibernate中繼承映射策略

public class GenericThing { 
    private Date createDate; 
    public Date getCreateDate() { 
     return createDate; 
    } 
    public void setCreateDate(Date dt) { 
     createDate = dt; 
    } 
} 

這很有用,因爲字面上數據庫中的每個表都具有CREATE_DATE列。

在這種情況下,在Hibernate中使用的正確的繼承策略是「每個具體類的表」。但是,這是「壞」,他們說,因爲每個表都需要相同的列,並且如果更改該列名(CREATE_DATE),則必須更改每個表的列名。那麼,顯然這是真的,但是有什麼選擇呢?很顯然,我希望數據庫中的每個表都存儲創建日期,但我不希望整個數據庫中的每個對象都在一個表中,這樣就排除了(據我所知)所有其他映射策略,正確的?

回答

0

問題table pet subclass多態性?父表包含commom列,子表的具體細節。

+0

每個子類的表似乎假定父類將在數據庫中。但正如你在我的例子中看到的,父類不是一個實際的數據庫對象。它是一個抽象類,它包含幾個對所有具體類都通用的字段。它不映射到任何特定的表。 – pete 2014-09-05 20:35:11

+0

我想我可以改變數據庫的結構,使其在表中保存父類。但是,這不需要每次我們想要訪問任何物品的創建日期時進行內部連接嗎? – pete 2014-09-05 21:23:54

+0

現在你讓我困惑。你不想在每個表中重複同一列,你不想在同一個表中保存整個層次結構,並且你不希望分開保存公共列並進行連接?那麼你究竟期待什麼?無論如何,請閱讀https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/inheritance.html,然後選擇您的選項。 – kaqqao 2014-09-06 13:03:08

1

實際上是爲你的用例,無可厚非使用Table per concrete class戰略

你正在試圖解決也沒有創造在架構級別任何冗餘(在創建表時)的問題。即使我們在反向模式下進行實體建模,也沒有問題。事實上,create_date是每個表格的每行特定的。

Table per concrete class只有當您正在處理普通繼承時,例如用戶 - >客戶 - >供應商,其中每個擴展類是一種父類,並且子類中添加的特定額外屬性不需要重複所有表(對於這種情況推薦使用Join Table策略)