2011-08-20 64 views
0

我有添加到我的數據庫(使用JPA)用戶和他的項目,關係多對多功能我的數據庫。我有以下表格:問題與添加值到使用JPA

profilUser

項目

associationProfileUserItem

在我輸入用戶的登錄名和密碼,我選擇的項目名稱列表的GUI,我又寫道項目的功能養病ID,由他們的名字(將它們添加到關聯)。 的問題是功能只插入最後一個項目choosen用戶而忽略休息!

我的代碼:

public void addProfilUser() 
{  
    try{ 

     EntityTransaction entr=em.getTransaction(); 
     entr.begin(); 
     AssociationItemProfilPK ItemprofilPk=new AssociationItemProfilPK(); 
     AssociationItemProfil Itemprofil=new AssociationItemProfil(); 
     ProfilUser user=new ProfilUser(); 

     user.setLogin(login); 
     user.setPassword(password); 
     em.persist(user); 

     for (Integer val : getListidItemByItemName()) 
     { 
     ItemprofilPk.setItemId(val); 
     ItemprofilPk.setProfilId(user.getProfilUserId()); 
     Itemprofil.setAssociationItemProfilPK(ItemprofilPk); 
     } 
      em.persist(Itemprofil); 
      entr.commit(); 
    } 
    catch (Exception e) 
    { 
     System.out.println(e.getMessage()); 
     System.out.println("Failed"); 
    } 
    finally { 
     em.close(); 
     emf.close(); 
    } 
} 



public ArrayList<Integer> getListidItemByItemName() 
{ 
    try{ 
    EntityTransaction entityTrans=emm.getTransaction(); 
    entityTrans.begin(); 
     for (String val : listItem) 
     { 
     System.out.println("my values"+val); 
     javax.persistence.Query multipleSelect= em.createQuery("SELECT i.ItemId FROM Item i WHERE i.ItemName IN (:w)"); 
     multipleSelect.setParameter("w", val); 
     List ItemId = new LinkedList(); 
     ItemId= multipleSelect.getResultList(); 
     listIdItem = new ArrayList(ItemId); 
     }  
     entityTrans.commit(); 
     System.out.println("Id for given item name"+listIdItem); 
     return listIdItem; 
    } 

    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

回答

1

有幾個問題與您的代碼。

第一招:你不尊重命名約定。變量應以小寫字母開頭。這使得您的代碼難以閱讀到經驗豐富的Java程序員。

第二個:你循環你的物品ID,並改變你的ItemprofilPkItemprofil對象的值。但是,您始終更新相同的對象,並且僅在循環後堅持該項目。所以,當然,只有最後一個值是持久的。更改爲這樣的:

for (Integer val : getListidItemByItemName()) { 
    AssociationItemProfilPK itemprofilPk = new AssociationItemProfilPK(); 
    AssociationItemProfil itemprofil = new AssociationItemProfil(); 

    itemprofilPk.setItemId(val); 
    itemprofilPk.setProfilId(user.getProfilUserId()); 
    itemprofil.setAssociationItemProfilPK(itemprofilPk); 
    em.persist(itemprofil); 
} 

第三個:你的映射比id需要更復雜。你不應該有一個實體來映射關聯表。相反,你應該有這樣的ProfilUser實體項目在Item實體列表,profilUsers的列表:

public class ProfilUser { 

    @ManyToMany 
    @JoinTable(
     name = "associationProfileUserItem", 
     joinColumns = @JoinColumn(name = "PROFIL_ID"), 
     [email protected](name="ITEM_ID") 
    private List<Item> items; 

} 

public class Item { 
    @ManyToMany(mappedBy = "items") 
    private List<ProfilUser profilUsers; 
} 
+0

,我想你的解決方案,但同樣的問題依然存在! – rym