2017-02-15 4 views
1

У меня есть два объекта с отношением ManyToMany между ними. По какой-то причине, когда я пытаюсь получить все сущности из базы данных, я получаю исключение "statement closed".Заявление закрытое исключение при получении ManyToMany связанных элементов

Вот код:

public class Famille { 

    [...] 

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "famille_personne", 
      [email protected](name="famille_id"), [email protected](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", 
     [email protected](name="personne_id"), [email protected](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. 

Может кто-нибудь объяснить мне, как это работает и почему я получаю это исключение?

ответ

0

В зависимости от того, используется ли контейнер для управления транзакцией или вы должны управлять ими вручную, а затем:

контейнера Диспетчером

Вам не нужно, чтобы закрыть 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; 
} 

Ручное управление

Вы должны создать и закрыть сделку Addtionally к тому, что вы написали:

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; 
    } 

Update

ошибка не показывает, но ваши отображения немного странно.

Вы, кажется, с нетерпением получаете обе стороны отображения, и это может привести к некоторым циклическим заданиям.

Я хотел бы предложить удаление EAGER выборки с одной стороны отношений т.х .:

@ManyToMany 
@JoinTable(name = "famille_personne", 
     [email protected](name="personne_id"), 
     [email protected](name="famille_id")) 
private Set<Famille> listFamille; 
+0

Я превратил мои два способа, как вы сказали, и он до сих пор не работает. Зачем мне начинать/совершать транзакцию? Никогда не делал этого так раньше, когда я получал некоторые значения, и он всегда работал –

+0

. Я думаю, что это может быть проблема с нетерпеливой выборкой с обеих сторон. Пожалуйста, проверьте мой обновленный ответ. –

+0

Прошу прощения за долгое время ответа. Я пробовал, как вы сказали, и я получаю исключение «не лениво инициализирую коллекцию роли». Иногда я хочу получить Personne.listFamille, а иногда и Famille.listPersonne, поэтому он не может работать ... –

Смежные вопросы