使用JPA将值添加到我的数据库中的问题

时间:2011-08-20 09:28:19

标签: java jpa

我有一个函数可以添加到我的数据库(使用JPA)用户和他的项目,多对多的关系。我有以下表格:

profilUser

项目

associationProfileUserItem

在GUI上我输入用户的登录名和密码,我选择一个项目名称列表,我有一个函数恢复项目名称ID(将它们添加到关联中)。 问题是函数只插入为用户选择的最后一项而忽略其余项!

我的代码:

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 个答案:

答案 0 :(得分: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"),
        inverseJoinColumns=@JoinColumn(name="ITEM_ID")
    private List<Item> items;

}

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