gpt4 book ai didi

java - 使用 JPA 将值添加到数据库时出现问题

转载 作者:行者123 更新时间:2023-12-01 15:45:27 25 4
gpt4 key购买 nike

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

个人资料用户

项目

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;
}

关于java - 使用 JPA 将值添加到数据库时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7130908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com