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,不知道这是否是个问题)。