Hibernate проблема с ленивой загрузкой в ​​представлениях - PullRequest
1 голос
/ 14 сентября 2011

В моем веб-приложении развернуты @Stateless ejb.Это веб-приложение развернуто в Glassfish V3.0.1

Моя модель домена состоит из двух классов: Master и Slave , причем мастер связан со многими подчиненными.

У меня есть представление jsf MyView , вызывающее метод displaySlaves на моем ejb MyEjb

В методе displaySlaves моего ejb без сохранения состояния MyEjb Я делаю это, все отлично работает:

    Master master = getEntityManager().find(Master.class, 0L);
    Set<Slave> slaves = master.getSlaves();
    System.out.println("Master : " + master + " and slaves "+ slaves.size());

Но если я попытаюсь, с моей точки зрения MyView , чтобы получитьссылка на master ( MyEjb возвращает только экземпляр master, но не вызывает master.getSlaves ()), а затем в MyView я вызываю getSlaves () для возвращенного экземпляра master, который я получаю:

org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию Slave: ни один сеанс или сеанс не закрыт.

Очевидно, когда поток выходит из ejb,сессия закрытаВот причина ошибки.

Но когда я использую eclipseLink вместо hibernate, все в порядке , у меня нет проблем с сеансом.EclipseLink не закрывает транзакцию при выходе из ejb.Это гораздо проще кодировать представление, просматривающее возвращенный экземпляр модели, чем получать все связанные объекты экземпляра модели в методе ejb.

Есть ли у кого-нибудь объяснение или обходной путь, чтобы заставить его работать с Спящий ?Моя предыдущая проблема - просто иллюстрация, и на самом деле у меня есть устаревшее приложение со многими сопоставленными классами, и рефакторинг аннотаций, необходимых для его работы с eclipseLink, кажется огромной задачей.

Любая помощь приветствуется.

Компоненты:

  • Glassfish 3.0.1
  • windows 7 64 бит JDK Sun 1.6.0.24
  • Hibernate 3.5.6-Final
  • tiredOldDevelopper v1 final - исчезает .

1 Ответ

1 голос
/ 15 сентября 2011

То, что вы описываете, вызывает недовольство разработчиков с годами. Слухи говорят, что Гэвин Кинг (создатель Hibernate) разработал JBoss Seam в основном для обеспечения чистого решения для отложенной загрузки представлений; -)

Пара вариантов:

  • отключить отложенную загрузку в метаданных JPA (FetchType.EAGER)
  • читайте о печально известной " открытой сессии в виде шаблона ", , но не используйте ее
  • если вам нужна ленивая загрузка ваших представлений, рассмотрите возможность добавления расширенного контекста персистентности в область диалога CDI (это то, что я бы предпочел)
...