0

@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@OneToOneP.setC(null)アタッチされたオブジェクトに。しかし、私の場合は不可能です。マージの時点で、デタッチされたオブジェクトはすでに「更新」されていますP

カスタムタプリザーなどを使用してマージするときに、子をどこかでnullに設定できますか?

これをどのように行うことができるかについて何かアイデアはありますか?

4

2 に答える 2

0

双方向の関連付けがありますが、一方がそれをとして宣言しOneToOne、もう一方(所有側)がそれを。として宣言しManyToOneます。

OneToOneの場合は、両側がOneToOneである必要があります。OneTomanyの場合は、一方がOneToManyで、もう一方がManyToOneである必要があります。

于 2012-05-30T16:56:04.270 に答える
0

P(1) にある C(1, a) のインスタンスが、作成したものではなく、永続的なコンテキストから新しいものである場合、切り離されたオブジェクトを正確に変更したいのはなぜですか。おそらく、C(1, a) への参照を新しい永続化されたものに更新し、それに変更を加えたいと思いませんか?

于 2012-05-30T17:37:35.763 に答える