2010-08-06 53 views
1

更新:張貼後,我發現這是this older question的副本。是否有可能*轉換多態Hibernate/JPA實體的類型?


我有一個奇怪的業務需求:我的應用程序支持用戶入門的「客人」,後來註冊成爲「註冊」用戶。

訪客功能受限:他們不允許訪問一些註冊後可用的功能。但是,他們確實可以訪問功能的一個子集,並可能在註冊之前開始累積持久性數據。這些功能中的很多功能都將在用戶實體類中建模爲方法,並且累積的數據自然會通過GuestUser的@Id關聯。

因此,我考慮作爲一個多態型的實體類型在JPA /休眠建模此:

 
      User 
      ^
      | 
     +-------------+ 
     |    | 
    GuestUser RegisteredUser 

我使用布爾辨別字段映射此;沒問題:

@DiscriminatorColumn(name="guest", discriminatorType=DiscriminatorType.INTEGER) 

這工作正常,直到GuestUser決定「註冊」...?!

現在,我想我的guestuser的轉變成一個RegisteredUser,通過設置

guestUser.guest = false; 

結果這種轉變將邏輯上清除從生存的guestuser的對象,然後用相同的獲取同等RegisteredUser ID和共享字段從繼承的用戶映射。

這可能嗎?我可以使用entityManager.refresh()以某種方式實現所需的結果嗎?我是否可以創建一個RegisteredUser實例並手動將它的ID分配給現有GuestUser的值? (這個ID分配的想法似乎有問題,因爲我們的遺留數據庫需要GenerationType.AUTO。)

+0

[如何更改JPA中的實體類型?](http://stackoverflow.com/questions/744520/how-to-change-entity-type-in​​-jpa) – 2010-08-06 06:48:35

回答

0

您是否嘗試更改guest標記,保存更改,然後使用相同的User.ID從數據庫加載新對象?

2

優先考慮繼承。無論如何,它更好的設計,更容易以一種能夠乾淨地處理這種變化的方式進行映射。

而不是按子類別區分,創建一個角色,當您想要更改他們可以訪問的內容時,可以重新分配該角色。

相關問題