2012-01-24 20 views
0

我已經採用了hibernate的table-per-class-hierarchy,概述爲here如何更新hibernate的table-per-class-hierarchy策略中的具體類?

我有一個簡單的1層層次結構,父級包含許多屬性,子(ren)包含更多相同的屬性。這個對象也有關係。例如:

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = {"name"}) }) 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, length = 1) 
abstract class X { 
... 
Long id; 
String name; 
List<A> a; 
... 
} 
class Y extends X { 
... 
String getType() { return "Y"; } 
... 
} 
class Z extends X { 
... 
String getType() { return "Z"; } 
... 
} 
class A {} 

我需要做的是將Y的持久實例「更新」爲保持完整性的Z實例。如果我發出刪除Y;創建Z,我得到的唯一約束違規(刪除跟隨由於Hibernate的排序創建/更新),但沒有發現任何策略,以「更新」 Y到Z

+0

我最終改變了層次結構,並使用子類型枚舉來促進具體類之間的差異。 –

回答

2

AFAIK,有沒有辦法做到這一點不繞過會議完全,因爲這意味着Java對象會改變它的具體類型,這是不可能的。即使如此,如果一個併發事務同時更新同一個實體,你最好還是樂觀併發。如果另一個事務刷新實體或延遲加載它,並且類型已更改,則會遇到問題。

總之,如果你需要這樣做,這可能意味着你不應該有繼承。考慮將表映射爲單個實體,具有類型列和可選字段。