2011-09-12 64 views
2

在JPA中,我想創建一個JPA對象的更新屏幕,並帶有該對象的類別列表。這是一個多對多的關係。JPA ManyToMany不填充對象屬性

我在具有以下屬性的JPA對象內的表上創建了一個連接關係。

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; 

我的問題的關鍵是包含以下邏輯內,我已經更新了數據庫,一切都在DB內大。但是,我的問題是,當我稍後訪問該對象時,對象中的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

當你的關係沒有額外的參數時,爲什麼你有一個ClassHasCategories類的M_N關係表?由於ClassesClassCategories一個@ManyToMany(cascade = CascadeType.ALL)關係,所有你需要做的是一樣的東西:

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

提供商將採取更新的關係表的照顧。您也可以從classCategoriesCollection使用類似的邏輯刪除項目:

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

因此,答案是:

  • 如果classes_has_class_categories沒有列,但有兩個FKS的PK,得到的ClassHasCategoriesClassHasCategoriesPK旅程。與classCategoriesCollection一起更新關係表。
  • 如果classes_has_class_categories有額外的列,然後重做你映射的方式,ClassHasCategoriesPK有兩個@ManyToOne關係,分別ClassesClassCategories。通過直接操作ClassHasCategories來更新關係。 Here是一個代碼示例。

拇指,切勿混合兩種策略(比如你是既具有@ManyToMany關係和獨立ClassHasCategories對象相同的表做)的規則。

乾杯,

+0

感謝,新來JPA,我仍然在找出如何正確映射關係。我需要找一本可靠的書。 – JCab

+0

很高興爲您服務。 JPA有它的特質,其中一些將甚至驅動有經驗的程序,直到他們在實踐中發現事情應該如何完成。我可以說的是:「在那裏,做到了」。 –

相關問題