3

1 対多の関係にある User と一連の Authorities があります。

User.hbm.xml:

<set name="authorities" table="authorities" cascade="all-delete-orphan">
    <key column="user_id" />
    <one-to-many class="com.ebisent.domain.Authority" />
</set>

ユーザーを削除するときに権限も削除したいのですが、代わりに子テーブルの外部キー (authorities.user_id) が null に設定されています。次に、次のエラーが発生し、ユーザーの削除がロールバックされます。

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

ただし、authorities.user_id の null への更新はロールバックされません。

親ユーザーを削除するときに権限を削除するにはどうすればよいですか?

編集:権限を明示的に削除refresh()し、ユーザーを呼び出してからユーザーを削除することでこれを機能させましたが、これを行う「正しい」方法を知りたいです。

4

1 に答える 1

1

これは奇妙です。all-delete-orphanカスケードはdelete操作を親から子にカスケードする必要があります。したがって、子を削除するには、次のようにすれば十分です。

Parent p = (Parent) session.load(Parent.class, pid);
session.delete(p);
session.flush();

を使用すると別の結果が得られますか、all,delete-orphanそれとももっと簡単にdelete(すべきではありません)。アソシエーションは双方向ですか? はいの場合、反対側と対応するマッピングを示していただけますか?

関連付けは親から子へのみであり、all、delete-orphan、delete で同じ結果が得られますが、session.flush() がなく、問題が解決したようです。

明示的なフラッシュが役立つ場合があります。しかし、それは必要ないはずです。外部キーをnull不可として定義すると、正しい動作を得るのに役立つと思います:

<set name="authorities" table="authorities" cascade="all-delete-orphan">
    <key column="user_id" not-null="true"/>
    <one-to-many class="com.ebisent.domain.Authority" />
</set>

ただし、テストされていません。

于 2010-09-19T17:01:29.567 に答える