我有一个功能,可以将用户及其项与多对多关系添加到数据库中(使用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,并更改ItemprofilPk
和Itemprofil
对象的值。但是,您总是更新相同的对象,并且仅在循环之后保留该项目。因此,当然,只有最后一个值得以保留。更改为以下内容:
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;
}