4

編集:問題をよりよく反映するように質問を変更します。最初に投稿された質問はこちら

親 ( Context) と子 ( User) エンティティ (ManyToOne 関係) があります。親の「REMOVE」をカスケードしても、子は削除されません。以下のようにコードします。

//Owning side - child
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = DBColumns.USER_NAME)
    private String name;
    @ManyToOne
    @JoinColumn(name = DBColumns.CONTEXT_ID)
    private Context context;
}

//parent
@Entity
public class Context {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = DBColumns.CONTEXT_NAME)
    private String name;
    @OneToMany(mappedBy = "context", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, orphanRemoval = true)
    private Set<User> users = new HashSet<User>();
}

//usage
Context sampleContext = new Context("sampleContext");
em.persist(sampleContext);
User sampleUser = new User(sampleContext, "sampleUser");
em.persist(sampleUser);
em.remove(sampleContext); //should remove user as well but throws foreign key dependency error
4

3 に答える 3

3

エンティティを削除する前に、エンティティを更新する必要がありました。

em.refresh(sampleContext);
em.remove(sampleContext);

以前、削除されたエンティティ ( sampleContext) は、sampleUserが関連付けられていることを認識していませんでした (おそらくsampleContextキャッシュからフェッチされたため)。beforeを実行すると、エンティティがデータベースrefreshからdelete確実に更新されます。

于 2013-04-12T07:23:11.980 に答える
1

sampleContext ではなく sampleUser で remove() を呼び出しており、User は remove を Context にカスケードしないため、削除されている User のみが表示されます。

sampleContext で remove() を呼び出す場合は、ユーザーを作成したときに、そのユーザーをコンテキストのユーザーに追加したことも確認する必要があります。ほとんどの場合、ユーザーのコンテキストのみを設定しています。

于 2013-04-10T13:34:24.727 に答える
0

リレーション テーブルを en エンティティとしてマップしないでください。代わりに使用@ManyToManyして、ユーザー エンティティを関係の所有者にします。

編集 :

したがって、関連付けテーブルの主キーは両方の外部キーで構成する必要があります。

これを参照してください http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa/

于 2013-04-09T18:28:12.030 に答える