我有一个功能,可以将用户及其项与多对多关系添加到数据库中(使用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();
    }

最佳答案

您的代码有几个问题。

第一个:您不尊重命名约定。变量应以小写字母开头。这使经验丰富的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;
}

08-17 16:35