@OneToOne替换实体

时间:2012-05-30 16:24:01

标签: java hibernate one-to-one

我有@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>)

情况如下:

我已将[{1}}和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)并不存在于数据库中,而hibernate没有获得删除C(1, b)的明确指令 - 但它应该是自动的,因为{{ 1}}。之后由于C(1, a)关系破坏而失败。我知道其中一个可能的解决方案是在附加对象上设置@OneToOne。但在我的情况下,这是不可能的。在合并的时候,我已经更新了#34;分离的对象@OneToOne

在使用自定义tuplizer或类似的东西合并期间,我可以在某处将child设置为null吗?

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

2 个答案:

答案 0 :(得分:0)

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

如果是OneToOne,双方应该是OneToOne。如果它是OneTomany,那么一边是OneToMany,另一边是ManyToOne。

答案 1 :(得分:0)

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