2011-08-20 63 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