我有@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吗?
你有什么想法可以做到这一点吗?
答案 0 :(得分:0)
您有双向关联,但是一方将其声明为OneToOne
,另一方(拥有方)将其声明为ManyToOne
。
如果是OneToOne,双方应该是OneToOne。如果它是OneTomany,那么一边是OneToMany,另一边是ManyToOne。
答案 1 :(得分:0)
当您在P(1)中的C(1,a)实例不是您创建的实例,而是来自持久化上下文的新实例时,为什么要更改分离的对象?也许您想将对C(1,a)的引用更新为新的,持久的,并对其进行更改?