我有@OneToOne
双向关系,其中父(P
)类具有:
@OneToOne(optional = true, mappedBy = "owner", orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
在 getter 上,子类 ( C
) 在 getter 上有:
@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)
then时C(1, a)
不会被删除,只会C(1, b)
被持久化。我知道这是因为它C(1, b)
在数据库中不存在并且休眠没有得到明确的删除指令C(1, a)
- 但它应该是自动的,因为@OneToOne
. 后来因为@OneToOne
关系破裂而失败。我知道设置了一种可能的解决方案P.setC(null)
在附着的物体上。但在我的情况下这是不可能的。在合并时,我已经“更新”了分离对象P
。
在使用自定义 tuplizer 或类似的东西合并期间,我可以在某处将 child 设置为 null 吗?
你有什么想法可以做到这一点吗?