>我有两个实体,它们之间有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.
有人可以解释我它是如何工作的以及为什么我得到这个异常吗?
根据您是使用容器来管理事务还是必须手动管理事务,然后:
容器管理器
您不需要手动关闭实体管理器,只需让容器为您完成:
@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;