2017-10-10 44 views
0

我有2個表小號數據庫(以1:1的關係)上,它們都具有相同的ID pk和我創建Hibernate類是像這樣的:創建缺失的子類實體時,存在超

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class S { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(...) 
    @SequenceGenerator... 
    private long id; 

    .... 
} 

@Entity 
@PrimaryKeyJoinColumn(name = "id") 
public class I extends S { 
    .... 
} 

由於歷史的原因,在數據庫中有型小號的對象,但不是類型的關聯對象。我想創建一個使用Hibernate的類型的對象。我怎樣才能做到這一點?我可以創建從左邊的類型的對象聯接HQL這樣的查詢?

select i from I i right join i.id s where s.id = :id 

如果我試圖創建一個新的實體(新我()),然後堅持它,我只設法獲得一些例外,因爲它試圖創建一個已經存在的小號記錄。我不能爲我實體做一個簡單的讀/負載爲記錄尚不存在。我該怎麼做才能創造這個失蹤部分實體?

PS如果你點我不清楚事情

+0

這是一個類似的情況在https://stackoverflow.com/questions/26038707/how-to-create-child-object-of-existing-super-object-using-joined-inheritance-st但我對解決這個問題的方法感興趣,不僅僅是他們的方法...... – MihaiS

回答

0

一個辦法,肯定會爲你工作(雖然是不乾淨的),我會調整的問題是創造我的記錄與SQL直接插入: insert into I_table values (...)。 當有I_table相應的記錄,ORM將開始I型載你的對象。

如果你留在你的ORM,你可以刪除小號的記錄,那麼你可以通過ID

  1. 負載S
  2. 刪除S(刷新?根據您的刷新模式)
  3. 創建I
  4. 複製S值到I
  5. 保存I
+0

這看起來像一個解決方案,但問題是S是一個大的實體樹的根,選擇這將意味着複製整個實體樹到另一個,至少可以說是很麻煩的。 – MihaiS

0

你想創造什麼是一個實體的層次結構。所以必須正確映射實體。下面是可能你需要什麼:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.CHAR) 
@DiscriminatorValue("S") 
public class S { 
    @Id 
    //........ 
    private long id; 

    .... 
} 

@Entity 
@DiscriminatorValue("I") 
public class I extends S { 
    .... 
} 
  • 使用此設置表S將包含一個名爲DTYPE(用於鑑別型)列標識行是否屬於SI;這是默認的;如果您不希望您必須提供註釋的名稱。

  • 創建的S一個實例,並保存

  • 創建的一個實例「I」通過填充繼承的屬性(即,S屬性)和它自己的屬性,和保存。

  • 當您創建一個查詢目標I,你只會得到實例I,但如果你的目標查詢的S,你會得到兩個實體的實例。