0

我有@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 吗?

你有什么想法可以做到这一点吗?

4

2 回答 2

0

当您在 P(1) 中拥有的 C(1, a) 的实例不是您创建的实例,而是来自持久上下文的新实例时,您究竟为什么要更改分离的对象。也许您想将您对 C(1, a) 的引用更新为新的、持久的引用,并对其进行更改?

于 2012-05-30T17:37:35.763 回答
0

您有一个双向关联,但一方将其声明为 a OneToOne,而另一方(拥有方)将其声明为 a ManyToOne

如果是OneToOne,应该两边都是OneToOne。如果是 OneTomany,则一侧应该是 OneToMany,另一侧应该是 ManyToOne。

于 2012-05-30T16:56:04.270 回答