3

テーブル内のレコードを削除すると、関連するレコードが別のテーブル内で削除されるはずです。しかし、代わりに私は受け取ります:

java.sql.BatchUpdateException:バッチエントリ0の更新child_table set parent_table_id = nullここで、parent_table_id=63は中止されました

上記の例外は、次の設定に対してスローされます。

@OneToMany(cascade = javax.persistence.CascadeType.ALL, targetEntity = ChildTable.class)
@JoinColumn(name = "parent_table_id")
@org.hibernate.annotations.Fetch(FetchMode.SUBSELECT)
public List<ChildTable> getTables() {
    return tables;
}

私が間違っていなければ、そのような注釈を付けて、ParentTableでレコードを削除すると、対応するリレーションが子1で削除されるはずです。完全に削除する前に(対応するレコードがもう存在しないため)「null」になろうとします。このid列は「nullではありません」。これを「null」にすると(この場合をテストするためだけに)、すべてが正しく機能します。

この背後にある本当の問題が何であるかを理解するのを手伝ってもらえますか?

前もって感謝します。

4

2 に答える 2

0

私は通常、注釈を使用しません。私はhbmマッピングファイルを好むので、hbmマッピングで考えられるいくつかの解決策を説明できます。:)親の1対多の関係にinverse=trueを追加する必要があると思います。親コレクションには常にinverse=trueを入れてくださいreverse = trueに相当する注釈については、これを参照してください。

これが機能しない場合は、適切な解決策ではないことを私は知っています。親の1対多の関係でnot-found = "ignore"または@NotFound(action = NotFoundAction.IGNORE)を試してみてください。 。最終的には、データベースの外部キー列に対してnot-null=falseを作成するのと同じ効果があります。

于 2012-07-07T08:58:14.863 に答える
0

回答者の1人が正解しましたが、彼はそれを削除しました。JPAアノテーションの代わりにHibernateカスケードアノテーションを使用する必要がありました。問題は、JPAと休止状態のアノテーションを一緒に使用するよりも少し深いため、うまくいきませんでした。ChildTableのマッパークラスには、idフィールドがマップされるParentTableクラスタイプではなく、intタイプのparent_table_idがありました。そのため、次のように変更しました。

@Entity
@Table(name = "child_table")
public class ChildTable {

private int id;
private int parent_table_id;
...

@Entity
@Table(name = "child_table")
public class ChildTable {

private int id;
private ParentTable parent_table;
...

確かに、いくつかの追加の変更(これに関連する)が行われ、削除が期待どおりに機能し始めました。

したがって、1対多の関係にあるエンティティの削除中に対応するエラーが発生し、アノテーションの使用法ですべてが正しい場合は、マッパークラスでタイプ、フィールドがであるかどうかを確認してください:)

于 2012-07-09T07:45:57.390 に答える