gpt4 book ai didi

java - 获取ManyToMany相关元素时语句关闭异常

转载 作者:行者123 更新时间:2023-11-29 13:50:20 25 4
gpt4 key购买 nike

我有两个实体,它们之间存在 ManyToMany 关系。出于某种原因,当我尝试从数据库中获取所有实体时,出现了一个"statement closed" 异常。

这是一些代码:

public class Famille {

[...]

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "famille_personne",
joinColumns=@JoinColumn(name="famille_id"), inverseJoinColumns=@JoinColumn(name="personne_id"))
private Set<Personne> listPersonne;

[...]

@Override
public boolean equals(Object object){

if(object instanceof Famille){
Famille famille = (Famille) object;

return (nom.equals(famille.getNom())
&& ((listPersonne == null && famille.getListPersonne() == null)
|| (listPersonne != null && new HashSet(listPersonne).equals(new HashSet(famille.getListPersonne())))
)
);
}
return false;

}
}

public class Personne {

[...]

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "famille_personne",
joinColumns=@JoinColumn(name="personne_id"), inverseJoinColumns=@JoinColumn(name="famille_id"))
private Set<Famille> listFamille;

[...]

@Override
public boolean equals(Object object){

if(object instanceof Personne){
Personne personne = (Personne) object;

return (matricule.equals(personne.getMatricule()) && nom.equals(personne.getNom()));
}
return false;

}

@Override
public int hashCode() {
return Objects.hash(matricule, nom);
}
}

这是我无法同时执行的两个查询的方法:

public ArrayList<Famille> getListFamille(){

entityManager = entityManagerFactory.createEntityManager();


ArrayList<Famille> listFamille = new ArrayList<Famille>();
listFamille.addAll(entityManager.createQuery("from Famille", Famille.class).getResultList());

entityManager.close();

return listFamille;
}

public ArrayList<Personne> getListPersonne(){

entityManager = entityManagerFactory.createEntityManager();


ArrayList<Personne> listPersonne = new ArrayList<Personne>();
listPersonne.addAll(entityManager.createQuery("from Personne", Personne.class).getResultList());

entityManager.close();

return listPersonne;
}

这是我遇到的异常:

org.postgresql.util.PSQLException: This statement has been closed.

有人可以向我解释它是如何工作的以及为什么我得到这个异常吗?

最佳答案

根据您是使用容器来管理您的事务还是必须手动管理它们,然后:

容器管理器

您不需要手动关闭 entityManager,只需让容器为您完成即可:

@PersistenceContext
EntityManager entityManager;

public ArrayList<Famille> getListFamille(){

ArrayList<Famille> listFamille = new ArrayList<Famille>();
listFamille.addAll(entityManager.createQuery("from Famille", Famille.class).getResultList());

// entityManager.close();

return listFamille;
}

手动管理

除了您所写的内容之外,您还必须创建和关闭交易:

public ArrayList<Famille> getListFamille(){

entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();

ArrayList<Famille> listFamille = new ArrayList<Famille>();
listFamille.addAll(entityManager.createQuery("from Famille", Famille.class).getResultList());

entityManager.getTransaction().commit();
entityManager.close();

return listFamille;
}

更新

错误没有显示出来,但你的映射有点奇怪。

您似乎急切地获取映射的两边,这可能会导致一些循环引用问题。

我建议从关系的一侧删除 EAGER 获取,即:

@ManyToMany
@JoinTable(name = "famille_personne",
joinColumns=@JoinColumn(name="personne_id"),
inverseJoinColumns=@JoinColumn(name="famille_id"))
private Set<Famille> listFamille;

关于java - 获取ManyToMany相关元素时语句关闭异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42250311/

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