@OneToOne
親(P
)クラスが持つ双方向の関係があります:
@OneToOne(optional = true, mappedBy = "owner", orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
ゲッターと子クラス(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)
おり、所有しています。ここで、コードのどこかでとの分離インスタンスを作成します。呼び出すと、すべてのプロパティがマージされ、更新されます。しかし、 デタッチされたオブジェクトをたとえばに変更すると、削除されず、永続化されるだけです。それはデータベースに存在せず、hibernateが削除するための明確な指示を取得しなかったためですが、おそらく自動であるはずです。後でそれは壊れた関係のために失敗します。考えられる解決策の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
。
カスタムタプリザーなどを使用してマージするときに、子をどこかでnullに設定できますか?
これをどのように行うことができるかについて何かアイデアはありますか?