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



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

最新更新