我@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嗎?
你有什麼想法如何做到這一點?
當我將'ManyToOne'更改爲'OneToOne'時我得到了'由於:org.hibernate.MappingException:外鍵(FKD57C55F9BEABB43A:m_reference [owner_id,owner_oid,target_id,target_oid]))必須具有與引用的主鍵(m_container [id,oid])' – viliam
如果我把它轉換爲'OneToOne',就會生成owner_id的唯一鍵,owner_oid。不能有這樣的唯一鍵,我沒有找到一種方法來禁用該唯一鍵。 – viliam