3

以下のように、単方向の「ManyToOne」関係を持つ「User」と「Department」の 2 つのエンティティ クラスがあります。

public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "DEPARTMENT_ID", nullable = true)
    private Department department;
}

public class Department{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}

一部のユーザーを削除し、部門を参照するユーザーがいない場合に参照された部門をカスケード削除する場合、使用する JPA の機能はありますか?

4

2 に答える 2

5

を使用できますがCascadeType.DELETE、この注釈は 内のオブジェクトにのみ適用されEntityManager、データベースには適用されません。ON DELETE CASCADEがデータベースの制約に追加されていることを確認する必要があります。確認するには、JPA を構成して ddl ファイルを生成できます。ddlファイルを見ると、それON DELETE CASCADEが制約の一部ではないことがわかります。ON DELETE CASCADEファイル内の実際の SQL に追加しddl、ddl からデータベース スキーマを更新します。これで問題が解決します。

このリンクは、MySQLON DELETE CASCADEで on forを使用する方法を示しています。CONSTRAINT制約に対してこれを行います。CREATE TABLEorALTER TABLEステートメントでも実行できます。JPA がALTER TABLEステートメントで制約を作成する可能性があります。ON DELETE CASCADEそのステートメントに追加するだけです。

一部の JPA 実装者は、この機能の手段を提供していることに注意してください。

Hibernate は@OnDeleteアノテーションを使用してこの機能を提供します。

于 2013-10-28T03:29:04.453 に答える
0

「孤立した」エントリを削除するように hibernate に指示できます。

@Cascade({ org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
于 2013-10-30T20:24:03.687 に答える