2012-04-25 28 views
1

私はhibertnateとJPAを使ってアプリケーションを作成しています。私は2つのクラス、すなわち人と仲間を持っています。それは人の詳細(名前、姓、性別など)を保持するので、人はかなり自明です。アソシエイトは、2人の人物(人物Bが並んだ人物)をリンクさせるクラスで、Facebookの「友人」のようなものです。人物(人物A)は関連のリストを保持し、関連オブジェクトは、リンクされる他の人物(人物B)およびそれらが有する関係のタイプ(友人、家族など)を保持する。このようにして、人物Aは、自分が誰と関連しているかを知ることができます(つまり、人物Aは人物Bとリンクしていることがわかります)。構造は吹く。Hibernate - オブジェクトを削除せずにオブジェクト参照を削除する

人がデータベースから削除されると、すべての関連付けが削除されるということが起こりそうです。それは削除された人物と他の人へのリンクです。問題は、Personクラスでカスケード削除を使用すると、関連付けオブジェクト内のすべてのPersonオブジェクトをPLUSで削除することです。すなわち、人物Aと人物Bが関連付けられている(関連オブジェクト内にある)場合。人物Aが削除されると、関連オブジェクトも人物Bとして削除されます。望む結果は、人物Aを参照する人物Aおよび人物Aを参照する人物のみが削除され、人物Bではなく削除されることです。人物Bオブジェクトは、 Bは削除されていない、ちょうど2人の間の関連。私はそれを行う方法がわかりません。どのように私は希望の結果を達成することができます上の任意のアイデア? 2人のオブジェクトのこの関連付けを行うためのより良い方法があるかどうかを確認します。


  • 構造:

Personクラス

@Entity

パブリッククラス人シリアライズ{

を実装します人 - - これはスケッチである
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クラスは @Entity

パブリッククラスアソシエイトは、シリアライズ{

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

//setters 
//getters 

}

答えて

0

が唯一のエンティティを作成し実装しますクラスの:

@Entity 
public class Person{ 

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

//setters 
//getters 
} 

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

+0

ご返信ありがとうございます。私はそれについて考えましたが、2人の関係(友人、家族同僚など)のような他のデータも追跡する必要があります。したがって、リスト内では、各人物はリスト所有者とは異なる関係になります。上記の構造を使って私ができることを知っていますか?私は現在、これを行う方法を見ることができません。 – rodmen88

+1

まあ... "アソシエイツ"の単一のリストを作成する代わりに、友達、家族、牛orkersなどの各関係のリストを作成します。 –

+1

それはあまりにも動作する可能性があります。私は解決策を見つけましたが。アソシエイトクラスにpersonオブジェクトを格納するのではなく、関連する人物のIDだけを格納します。言い換えれば、(Associateクラスの)Associateのデータ型をPersonからLongに変更しただけで、関連属性のpersonのIDが格納されました。そうすれば、私はカスケードして削除することはできませんし、実際の人物を削除することはできませんが、私はまた、私はそれが必要なときにだけ人の完全な詳細を取得することができます。あなたの助けと意見をお寄せいただきありがとうございます。 – rodmen88

関連する問題