我有一个函数可以添加到我的数据库(使用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();
}
答案 0 :(得分:1)
您的代码存在一些问题。
第一个:您不尊重命名约定。变量应以小写字母开头。这使得您的代码更难以为经验丰富的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;
}