1

hibertnate と JPA を使用してアプリケーションを作成しています。PersonとAssociateという2つのクラスがあります。Person は、人の詳細 (名前、姓、性別など) を保持しているため、一目瞭然です。Associate は 2 つの人物オブジェクト (人物 A と人物 B) をリンクするクラスで、Facebook の「友達」のようなものです。簡単に言うと、人 (A さん) は仲間のリストを保持し、Associate オブジェクトはリンクされる他の人 (B さん) とその関係の種類 (友人、家族など) を保持します。このようにして、人物 A は自分が誰と関係があるかを知ることができます (つまり、人物 A は自分が人物 B と関係があることを知っています)。構造は打撃です。

ある人物がデータベースから削除されると、その人物との関連もすべて削除されると考えられています。それは削除された人であり、他の人へのリンクです。問題は、Person クラスでカスケード削除を使用すると、関連付けに加えて関連付けオブジェクト内のすべての人物オブジェクトが削除されることです。つまり、人物 A と人物 B が (関連オブジェクトで) 関連付けられている場合です。人物 A が削除されると、関連付けられたオブジェクトは人物 B と同様に削除されます。望ましい結果は、人物 A および人物 A を参照する関連付けオブジェクトのみが削除され、人物 B は削除されないことです。人物 B のオブジェクトは、人物としてデータベースに残る必要があります。 B は削除されていません。2 人の関係だけです。その方法がわかりません。どうすれば望ましい結果を達成できるかについてのアイデアはありますか? または、この 2 人の人物オブジェクトの関連付けを行うためのより良い方法があるかどうか。


  • 構造:

パーソンクラス

@実在物

public class Person は Serializable を実装します {

 private Long id;
 private String firstName;
 private String lastName;
 private String gender;
 @OneToMany (cascade = {CascadeType.ALL})
 @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})
 @JoinColumn(name = "person_id")
 private List<Associate> associations;

 //setters
 //getters

}

ASSOCIATE CLASS @エンティティ

public class Associate は Serializable を実装します {

 private Long id;
 @ManyToOne
 private Person associate;
 private String relationshipType;
 @OneToOne (cascade = {CascadeType.ALL})
 @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})
 private AssociateSettings;

 //setters
 //getters

}

4

1 に答える 1

0

Person というエンティティを 1 つだけ作成します。これはクラスのスケッチです。

@Entity
public class Person{

 private Long id;
 private String firstName;
 private String lastName;
 private String gender;
 @OneToMany
 private List<Person> associates; 

 //setters
 //getters
}

各人物は、他の人物のコレクションに関連付けることができます。カスケード削除は使用しないでください。1 人だけを削除するだけで、データベースの半分を簡単に消去できます。

于 2012-04-25T20:40:59.030 に答える