2012-05-30 54 views
0

@OneToOne雙向關係,其中母公司(P)類有:@OneToOne取代實體

@OneToOne(optional = true, mappedBy = "owner", orphanRemoval = true) 
@Cascade({org.hibernate.annotations.CascadeType.ALL}) 

的getter和子類(C)對消氣:

@ForeignKey(name = "fk_reference_owner") 
@MapsId("owner") 
@ManyToOne(fetch = FetchType.LAZY) 
@PrimaryKeyJoinColumns({ 
     @PrimaryKeyJoinColumn(name = "owner_oid", referencedColumnName = "oid"), 
     @PrimaryKeyJoinColumn(name = "owner_id", referencedColumnName = "id") 
}) 

縮寫:

P(<it's primary key>)

C(<it's primary key, and it's also FK to P>, <another PK>)

情況是這樣的:

我有P(1)C(1, a)堅持數據庫 - 和C(1, a)P(1)擁有。現在在代碼的某處我創建了P(1)C(1, a)的分離實例。當我打電話給session.merge(p)時,所有屬性合併,並在session.commit()後更新。但是,當我將分離對象上的C(1, a)更改爲例如C(1, b)時,則不會刪除C(1, a),只會保留C(1, b)。我知道這是因爲C(1, b)在數據庫中不存在,並且休眠沒有得到明確的指令來刪除C(1, a) - 但它應該可能是自動的,因爲@OneToOne。後來因失敗@OneToOne關係失敗。我知道可能的解決方案之一是在連接的對象上設置P.setC(null)。但對我而言這是不可能的。在合併時,我已經有「更新」分離對象P

在使用自定義tuplizer或類似的東西合併過程中,我可以將child設置爲null嗎?

你有什麼想法如何做到這一點?

回答

0

您有雙向關聯,但一方聲明它爲OneToOne,另一方(擁有方)聲明它爲ManyToOne

如果是OneToOne,它應該是OneToOne的兩邊。如果它是一個OneTomany,它應該是OneToMany在一邊而ManyToOne在另一邊。

+0

當我將'ManyToOne'更改爲'OneToOne'時我得到了'由於:org.hibernate.MappingException:外鍵(FKD57C55F9BEABB43A:m_reference [owner_id,owner_oid,target_id,target_oid]))必須具有與引用的主鍵(m_container [id,oid])' – viliam

+0

如果我把它轉換爲'OneToOne',就會生成owner_id的唯一鍵,owner_oid。不能有這樣的唯一鍵,我沒有找到一種方法來禁用該唯一鍵。 – viliam

0

當你在P(1)中擁有的C(1,a)實例不是你創建的實例,而是一個新的實例時,爲什麼要更改分離的對象? 。也許你想將你對C(1,a)的引用更新爲新的持久化引用,並對其進行更改?

+0

不能這樣做。更改應用於業務對象,因此我總是獲得新的對象狀態。比我翻譯這個對象到我的映射實體類。這就是爲什麼它有時發生的情況是先前包含C(1,a)的實例P(1)現在包含C(1,b)。我不知道究竟發生了什麼變化,因此我使用session.merge()。 – viliam

相關問題