2013-11-04 50 views
0

經過良好測試的運行系統已經定義了一個名爲'User'的實體。ORM從多個數據庫表創建單個實體

現在我需要添加一個新的屬性到用戶實體(例如:年齡) 要以安全的方式做到這一點,我不喜歡對現有的數據庫表做任何更改,因爲這是非常危險的我的情況。我需要一種方法來用最少的代碼更改重建用戶實體。

所以我的建議是:

  • 創建新表(user_age),有兩列(USER_ID,年齡)
  • 修改用戶實體添加屬性「年齡」和消氣制定者
  • 因此,我的實體(用戶)的屬性,將保存到兩個不同的表(用戶和user_age)
  • 加載用戶也同樣。

這是可以做到與休眠....?

如果沒有,任何其他更安全的方式與Hibernate做到這一點...?

什麼是提供這種功能的可用的ORM(NHibernate的,entityframwork,等等......或任何其他ORM)...?

+0

你的意思是Hibernate,還是你的意思是NHibernate?也就是說,你在.NET中還是在Java中工作? –

+0

我正在對ORM進行一般分析,因此不需要擔心java或.net –

+0

但是您說您已經擁有「經過良好測試的運行系統」。這個系統運行什麼語言?你是否建議你願意拋棄所有這些好的,已經穩定的代碼,只是爲了實現這一功能? –

回答

0

是的。你可以做到這一點。
我用於類似的問題joined-subclass

基地

<class name="User" table="Users"> 
    <id name="Code" type="System.Guid"> 
     <column name="Code" /> 
     <generator class="guid.comb" /> 
    </id> 
    ... 
</class> 

子類

<joined-subclass name="UserExt" extends=User" table="UsersExt"> 
    <key column="Code" /> 

    <property name="Age"> 
     <column name="Age" not-null="true" /> 
    </property> 
</joined-subclass> 

一個很好的參考here

0

NHibernate的join映射正是這種情況。

Ayende's blogdocumentation以獲取更多信息。從文檔:

使用<join>元素時,可以將一個類的屬性映射到多個表,當表之間存在1對1關係時。

從我的搜索,它看起來也可以用實體框架做到這一點:Simon J Ince - Mapping two Tables to one Entity in the Entity Framework。我想,這文章是關於實體框架V1,事情可能現在已經改變了,但它似乎有在實體框架的版本映射的一個重要的限制:

...它需要在每一個記錄表存在,因爲生成的SQL使用INNER JOIN。如果你使用的是新模型,這是有道理的,但如果你映射到現有的模式和數據,我想這會更加棘手。

與NHibernate,你可以設置在join映射optional屬性來告訴它使用外連接,而不是內部連接。

optional(可選 - 默認爲false):如果打開,NHibernate的會插入僅當此連接定義的屬性非空,並且總是使用一個外排連接來得到這些屬性。