2013-11-20 218 views
1

我有兩個類JPA繼承 - 更改實體類型

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="PERSONTYPE") 
@DiscriminatorValue(value="PERSON") 
public class Parent { 
    ....... 
} 


@Entity 
@DiscriminatorValue(value="CHILD") 
public class Child extends Parent{ 
    ....... 
} 

的情況下,我有:

1-創建人 - 那麼PERSONTYPE = '人'

2-進入Person頁面並通過選中「Is Child」複選框將其更新爲'CHILD',然後在保存Person後必須保存爲'CHILD'類型。

那麼如何將實體類型從'PERSON'更改爲'CHILD'?

在此先感謝

+0

做你嘗試分配的孩子到新的父實例包括id字段的值是多少? – erencan

+1

繼承不是這裏正確的設計。就像在Java中一樣,對象也不能改變它的類型。使用帶有子標誌的單個實體。 –

回答

0

這裏有幾個可能性:

這似乎顯而易見的事情將是父對象上setIsChild(真)並提交它,但是我不知道怎麼樣JPA將對此做出反應,因爲您現在正在提交一個Parent,結果是一個Child。不知道這是可能的。這絕對值得一試。

另一個選擇是編寫JPA更新語句(繞過子對象和父對象)來更新數據庫中的is_child列。然後,當您隨後查詢此記錄時,您將收到一個孩子不是父母。

最後,您可以創建一個包含所有父對象值的子對象,然後刪除父對象並創建子對象。這將起作用,但除了刪除/創建所需的額外處理,而不是一個簡單的更新,孩子的ID可能會改變(如果您使用自動生成的ID,它會改變)。國際海事組織,這不是一個好的解決方案,但它會工作。

+0

感謝cmd爲你回覆:) – User

+0

其實我想改變DiscriminatorColumn「PERSONTYPE」在數據庫中更改爲隨後創建JPA查詢,選擇所有的孩子,所以我只是寫'從兒童選擇c',如果我添加布爾isChild我必須修改我所做的問題,並且對於最後的解決方案與我的情況無效,因爲舊問題與其他實體有關,因此無法刪除它?你有沒有其他的建議或不可行? – User

0

我假設你有一個子對象這就是獨特的性能爲什麼要使用繼承,otherwize就像@ZB Ziet評論你應該使用兒童標誌

解決方案1 ​​

我看到你正在使用單表繼承策略,因此您必須修改descriminator字段manulay(通過使用SQL查詢)並在子表上設置適當的字段。

UPDATE Parent SET PERSONTYPE='CHILD' WHERE id = 1 

practicaly您使用本機查詢,這樣

enityManager.createNativeQuery(「UPDATE PERSON SET PERSONTYPE = ?, 」 
「 VERSION = VERSION + 1 WHERE ID = ?」) 
.setParameter(1, 'CHILD') 
.setParameter(2,personID) 
.executeUpdate(); 

那麼你可以使用EntityManager的獲得孩子和設置屬性

entityManager.find(Child.class,1).childProp=xxxx

**解決方案2 **

國際海事組織,這裏做的最好的事情是代替usi吳單表策略,你應該使用連接表的策略

在連接表的戰略新表

entireis爲每個孩子有thier id作爲外鍵父實體創建的。因此更改ID還將設置其父

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Person { 
... 

那將是冷靜,如果你可以創建新的子集的ID相同,家長和保存。 Child c = new Child(); c.setId(parent.getId()); entityManager.merge(c)。但是hibernate試圖重新創建一個父對象導致id confilict。

所以解決的辦法就是編寫本地查詢 em.createNativeQuery("INSERT into child (id) VALUES (1)").executeUpdate(); //1 being the parent id

more reference on inheritance