2011-12-31 6 views
0

JSFとJPA(Eclipseリンク)を使用してWebアプリケーションを開発しています。双方向のOneToMany関係を持つ2つのエンティティがあります。所有者エンティティは連絡先であり、ターゲットエンティティは顧客です。単一の顧客は、電子メール、電話などの複数の連絡先を持つことができます。エンドユーザーが新しい顧客を追加すると、連絡先もすぐに追加されます。その顧客に連絡先を追加した後でも、新しい顧客の保存をキャンセルする必要があります。私はその機能を追加しようとしましたが、以下のように失敗しました。JPA:主オブジェクトが永続化されている場合にのみ、配列内の子オブジェクトを永続化できますか?

このシナリオは永続性によって直接達成できますか?

お客様に新しい連絡先を追加する連絡先エンティティ

.... 
public class Contact implements Serializable { 
    .... 
    @ManyToOne 
    Customer customer; 
    .... 

顧客エンティティ

.... 
public class Customer implements Serializable { 
    .... 
    @OneToMany(mappedBy = "customer") 
    private List<Contact> contacts; 
    .... 

(現在は、Customerクラスのオブジェクトである)

Contact contact = new Contact(); 
contact.setCustomer(current); 
.... 
current.getInstitutionContacts().add(contact); 

電流があるとき、これは動作しますすでに永続しているまだ連絡先を追加しようとした場合、連絡先を保持するにはjava.lang.NullPointerExceptionがあります。

私はこの機能を実現するために回避することができますが、連絡先をアレイに収集し、顧客が永続化されている場合にのみ永続化する方法はありますか?カスケード永続性や遅延フェッチなどを使用することで?

+0

は、current.getInstitutionContacts()から来るNPEです。現在のものが新しい場合は、リスト配列を初期化する必要があります。データベースから読み込んだ場合、リストはプロバイダによって作成されます。 Customer-> contactsの関係でカスケード永続化/マージを設定すると、顧客がいるときに連絡先を保持することができます。 – Chris

答えて

0

連絡先をのように聞こえます。ではなく、エンティティです。

違いは、エンティティには独自のライフサイクルがあることです。それは関連の範囲外に存在し、親を削除することは必ずしも子を削除する必要はありません。また、子がエンティティである場合、他のクラスもその子との関係を持つことができます。

コンポーネントは完全に親にバインドされています。親が遠ざかると自動的に消えます。彼らは他の団体や他の団体によって参照されることはできません。親クラスの単純なプロパティのようなものです。

唯一の注意点は、すべてのJPA実装でコンポーネントのコレクションがサポートされているかどうかわかりません。

this documentationを参照してください。特に、埋め込み可能なオブジェクト(@OneToOne、@ManyToOne、@OneToMany、@ManyToManyなど)でアソシエーションアノテーションを使用することもできます。アソシエーション列をオーバーライドするには、@AssociationOverrideを使用できます。使用しているJPAの実装がない場合

することは、あなたが@Embeddable注釈と@OneToMany

編集を使用することができます - 私はまたここに情報http://en.wikibooks.org/wiki/Java_Persistence/Embeddables#Collectionsを見つけました。

関連する問題