2011-09-12 2 views
2

JPAでは、JPAオブジェクトのカテゴリのリストを含むJPAオブジェクトの更新画面を作成しようとしています。これは多対多関係です。JPA ManyToManyオブジェクトのプロパティを設定しない

次のプロパティを持つJPAオブジェクト内のテーブルに結合関係を作成しています。

私はデータベースを更新しましたし、すべてがDB内偉大であるようClasses.java

@JoinTable(name = "classes_has_class_categories",joinColumns = { 
@JoinColumn(name = "classes_id", referencedColumnName = "id")}, inverseJoinColumns = { 
@JoinColumn(name = "class_categories_id", referencedColumnName = "id")}) 
@ManyToMany(cascade = CascadeType.ALL) 
private Collection<ClassCategories> classCategoriesCollection; 

私の質問への鍵は、以下のロジック内に含まれています。しかし、私の問題は、後でオブジェクトにアクセスすると、オブジェクト内のclassCategoriesCollectionプロパティにすべての正しいオブジェクトが含まれていないことです。私は、以下の私のフラッシュとリフレッシュ・コールはすべてをデータベースと同期させると思っていましたが、アプリケーションを再デプロイ/再コンパイルするまで、そのオブジェクト・プロパティは空です。このオブジェクトをオブジェクトの現在のデータベースと同期させる方法を知ってお手伝いください。

ClassManager.java

for(String c : cats) 
{ 
     int cId = ConvertToInt(c); 
     ClassCategories ca = em.find(ClassCategories.class, cId); 

     if(ca != null) 
     { 

     try{ 
      if(!cla.getClassCategoriesCollection().contains(ca)) 
      { 
       ClassHasCategoriesPK classHasCategoriesPK= new ClassHasCategoriesPK(); 

       classHasCategoriesPK.setCategoryId(ca.getId()); 
       classHasCategoriesPK.setClassId(cla.getId()); 

       ClassHasCategories cd = new ClassHasCategories(classHasCategoriesPK); 

       em.persist(cd); 
       em.flush();        

      } 
     } 
     catch (Exception ex) 
     {}  
     } 
     } 

     em.persist(cla); //cla is the Class object instance. 
     em.flush(); 
     em.refresh(cla); 

後でコードで....

request.setAttribute("classCategories",cl.getClassCategoriesCollection()); 

は、アプリケーションの再コンパイルまで右のクラスを持っていません。

答えて

2

リレーションシップに余分なパラメータがない場合、M_NリレーションシップテーブルにはなぜClassHasCategoriesクラスがありますか?プロバイダが関係テーブルを更新するの世話をする

classObj.getClassCategoriesCollection().add(classCategoryObj); 
em.merge(classObj). 

ClassesClassCategories@ManyToMany(cascade = CascadeType.ALL)関係を持っているので、あなたがやっているために必要なすべてのようなものです。あなたはまた、同様のロジックを使用してclassCategoriesCollectionから項目を削除することができます

classObj.getClassCategoriesCollection().remove(classCategoryObj); 
em.merge(classObj). 

だから、答えは次のとおりです。

  • classes_has_class_categoriesは何の列が、2つのFKSでPKを持っていない場合は、ClassHasCategoriesClassHasCategoriesPKの乗り心地を取得します。関係テーブルを更新するには、classCategoriesCollectionと協力してください。
  • classes_has_class_categoriesに余分な列がある場合、ClassesClassCategoriesのそれぞれClassHasCategoriesPKに2つの@ManyToOneの関係があるようにマッピングをやり直してください。 ClassHasCategoriesを直接操作して関係を更新します。 Hereはコード例です。

(あなたが@ManyToMany関係と同じテーブルに別々のClassHasCategoriesオブジェクトの両方を持つことによって行っているように)、両方の戦略を混在されることはありません親指のルール。

乾杯、

+0

JPAを初めてお使いいただきありがとうございます。関係を適切にマップする方法をまだ検討しています。私は固体の本をピックアップする必要があります。 – JCab

+0

喜んでサービスします。 JPAにはその特質がありますが、その中には経験豊富なプログラムでさえも、実際にどのように物事が行われているのかを知るまでは動かないものがあります。私が言うことができるのは、「そこにいて、それをした」ということです。 –

関連する問題