2012-12-19 101 views
2

想知道Hibernate是否支持實體中靜態屬性和動態屬性的組合。例如Hibernate是否在運行時支持混合實體模式?

public class User 
{ 
    private Long id; 
    private String first_name; 
    private String last_name; 
    private Map<String,Object> dynamicProperties; 
} 

我可以通過在運行時從Db讀取用戶表的元數據來獲取動態屬性。 基本上我正在研究支持多個客戶端的產品。

對於一個客戶端的用戶表可以有像列idfirst_namelast_name只而對於其他客戶端用戶表需要存儲像DOBTitle兩個相加列。

考慮到id,first_namelast_name作爲所有客戶端之間的常見屬性集,我將這些屬性用作靜態屬性和休息我計劃將其作爲實體中的映射進行存儲。不知道死於休眠支持這一點。

約束是代碼僅在運行時才知道動態屬性列。

回答

0

我認爲您的製圖策略需要考慮。在休眠你想你的模式靜態。我會建議將dynamicProperties重命名爲metaData,並使該映射具有字符串鍵和字符串值,然後將其作爲映射屬性包含在您的hibernate映射文件中。在映射的hibernate中映射通用對象值並不合理。另一種方法是將該地圖標記爲@transient,但我認爲第一個建議更有意義。您需要特定於客戶端的元數據,以便將其映射爲模式的一部分。

+0

這是你的問題的一部分,我不明白「約束是代碼只知道在運行時動態屬性列」,對我來說,這似乎是一個瞬態屬性不明白爲什麼你需要這個約束 –

+0

謝謝鄧肯。讓我進一步解釋我的問題。我正在研究支持多個組織作爲客戶的產品。一個組織的員工定義可以有3個字段,如id,firstName,lastName,而對於其他組織,可以有5個字段,如id,firstName,lastName,出生日期,稱呼等。爲了支持這些變體,我使用Employee的通用屬性作爲存儲在名爲dynamicProperties的映射中的Object和客戶端特定屬性的屬性。所以基本上每當一個新的客戶端進入代碼將從數據庫中讀取元數據。 – user1914503

+0

更多關於「來自db的元數據」的更多信息,您對所有客戶端都堅持一種架構嗎?那麼像CustomProperty這樣的對象具有一個id和一個字符串值以及一個可以在運行時輸出的數據類型的常量。那麼我想你可以爲這個元數據編寫一個自定義的查詢方法。但是每個客戶都有相同的模式權限? –

0

我正在研究的項目完全是這樣(動態的,每客戶端模型)。但是,我們不會嘗試在同一行上混用靜態(基於類)和動態實體。您可以通過將模型的靜態部分與動態部分分開,並使用EntityMode.MAP實體將靜態與類和動態部分進行映射,從而輕鬆完成所需的任務。我已提交patch for Hibernate 4.1,允許您使用EntityMode.MAP使用JPA條件查詢。這使得動態查詢生成更加簡單。

相關問題