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

时间:2017-02-15 13:08:20

标签: java postgresql hibernate

我有两个实体,它们之间有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.

有人可以解释一下它是如何工作的以及为什么我得到这个例外?

1 个答案:

答案 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;