Java 获取多个相关元素时语句关闭异常
我有两个实体,它们之间有很多关系。出于某种原因,当我试图从数据库中获取所有实体时,我得到了一个Java 获取多个相关元素时语句关闭异常,java,postgresql,hibernate,Java,Postgresql,Hibernate,我有两个实体,它们之间有很多关系。出于某种原因,当我试图从数据库中获取所有实体时,我得到了一个“statement closed”异常 下面是一些代码: public class Famille { [...] @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinTable(name = "famille_personne", joinColumns=@Jo
“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);
}
}
有人能解释一下它是如何工作的,为什么我会遇到这个异常吗 根据您是使用容器管理事务还是必须手动管理事务,然后: 容器管理器 您无需手动关闭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;
}
@PersistenceContext
实体管理器实体管理器;
公共数组列表getListFamille(){
ArrayList listFamille=新的ArrayList();
listFamille.addAll(entityManager.createQuery(“来自Famille”,Famille.class).getResultList());
//entityManager.close();
回归家庭;
}
手动管理
您必须创建并关闭与您所写内容相同的事务:
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;
}
public ArrayList getListFamille(){
entityManager=entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
ArrayList listFamille=新的ArrayList();
listFamille.addAll(entityManager.createQuery(“来自Famille”,Famille.class).getResultList());
entityManager.getTransaction().commit();
entityManager.close();
回归家庭;
}
更新
错误没有显示出来,但是您的映射有点奇怪
您似乎急于获取映射的两面,这可能会导致一些循环引用问题
我建议从关系的一方删除急切获取,即:
@ManyToMany
@JoinTable(name = "famille_personne",
joinColumns=@JoinColumn(name="personne_id"),
inverseJoinColumns=@JoinColumn(name="famille_id"))
private Set<Famille> listFamille;
@manytomy
@JoinTable(name=“famille_personne”,
joinColumns=@JoinColumn(name=“personne_id”),
inverseJoinColumns=@JoinColumn(name=“famille_id”))
私有集合列表;
根据您是使用容器管理交易还是必须手动管理交易,然后:
容器管理器
您无需手动关闭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;
}
@PersistenceContext
实体管理器实体管理器;
公共数组列表getListFamille(){
ArrayList listFamille=新的ArrayList();
listFamille.addAll(entityManager.createQuery(“来自Famille”,Famille.class).getResultList());
//entityManager.close();
回归家庭;
}
手动管理
您必须创建并关闭与您所写内容相同的事务:
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;
}
public ArrayList getListFamille(){
entityManager=entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
ArrayList listFamille=新的ArrayList();
listFamille.addAll(entityManager.createQuery(“来自Famille”,Famille.class).getResultList());
entityManager.getTransaction().commit();
entityManager.close();
回归家庭;
}
更新
错误没有显示出来,但是您的映射有点奇怪
您似乎急于获取映射的两面,这可能会导致一些循环引用问题
我建议从关系的一方删除急切获取,即:
@ManyToMany
@JoinTable(name = "famille_personne",
joinColumns=@JoinColumn(name="personne_id"),
inverseJoinColumns=@JoinColumn(name="famille_id"))
private Set<Famille> listFamille;
@manytomy
@JoinTable(name=“famille_personne”,
joinColumns=@JoinColumn(name=“personne_id”),
inverseJoinColumns=@JoinColumn(name=“famille_id”))
私有集合列表;
正如您所说,我已经改变了我的两种方法,但仍然不起作用。为什么我要开始/提交事务?我以前从来没有这样做过,当我得到一些值时,它总是有效的。我想这可能是双方都急于获取的问题。。请查看我的最新答案抱歉,回复时间过长。正如您所说,我已经尝试过了,我得到了一个“未能延迟初始化角色集合”异常。有时我想获取persone.listFamille,有时我想获取famile.listPersonne,这样它就无法工作了……这是因为您试图在事务之外访问集合。顺便提一下在实体的hashCode/equals方法中。。您是否使用这些多个依赖项进行比较?是的,我知道,这就是为什么我不能删除这些依赖项的原因。。。我不知道我是否理解你,所以我添加了我编写的方法的代码(忘记为Famile编写hashcode,不知道这是否是个问题)。我已经按照你所说的转换了我的两个方法,但仍然不起作用。为什么我要开始/提交事务?我以前从来没有这样做过,当我得到一些值时,它总是有效的。我想这可能是双方都急于获取的问题。。请查看我的最新答案抱歉,回复时间过长。正如您所说,我已经尝试过了,我得到了一个“未能延迟初始化角色集合”异常。有时我想获取persone.listFamille,有时我想获取famile.listPersonne,这样它就无法工作了……这是因为您试图在事务之外访问集合。顺便提一下在实体的hashCode/equals方法中。。您是否使用这些多个依赖项进行比较?是的,我知道,这就是为什么我不能删除这些依赖项的原因。。。不知道我是否理解您,所以我添加了我编写的方法的代码(忘记为Famille编写hashcode,不知道这是否是个问题)。