我有两个实体,它们之间有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.
有人可以解释一下它是如何工作的以及为什么我得到这个例外?
答案 0 :(得分:0)
根据您是使用容器管理交易还是必须手动管理,<:p>
货柜经理
您不需要手动关闭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;