2012-05-24 5 views
3

Моего решения состоит из 3 различных проектов:Java-EE6: FetchType.LAZY со статическим ткачеством бросает странное исключение

  • EJB проекта с Netbeans автоматически генерируемыми Фасадами для управления классами сущностей и persistence.xml

  • класс библиотека, которая содержит все @Entity аннотированную и статический сотканы классы баз данных и удаленные интерфейсы для фасада объекта EJB (совместно EJB и обособленных клиента)

  • Автономные клиента, который состоит в основном Качели GUI классов

Я использую Glassfish 3.1.2, EclipseLink 2.3 в качестве JPA-провайдера, Netbeans 7.1.1 и базы данных MySQL. Я настроил Ant-задачу, которая статически перетаскивает мои классы объектов на основе persistence.xml.

У меня есть несколько @OneToOne, @ManyToOne и @ManyToMany аннотированные отношения между сущностями, украшенными fetch = FetchType.LAZY.

Теперь я получаю все вместе следующие ошибки:

Exception in thread "Mainframe Loader" Local Exception Stack: 
Exception [EclipseLink-7242] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):  org.eclipse.persistence.exceptions.ValidationException 
Exception Description: An attempt was made to traverse a relationship using indirection that had a null Session. This often occurs when an entity with an uninstantiated LAZY relationship is serialized and that lazy relationship is traversed after serialization. To avoid this issue, instantiate the LAZY relationship prior to serialization. 
at org.eclipse.persistence.exceptions.ValidationException.instantiatingValueholderWithNullSession(ValidationException.java:998) 
at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:220) 
at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88) 
at org.eclipse.persistence.indirection.IndirectList.buildDelegate(IndirectList.java:244) 
at org.eclipse.persistence.indirection.IndirectList.getDelegate(IndirectList.java:414) 
at org.eclipse.persistence.indirection.IndirectList.size(IndirectList.java:752) 
at ch.lawsuite.gui.mail.PosteingangUI.updateDokumentTable(PosteingangUI.java:47) 
at ch.lawsuite.gui.mail.MailboxUI.updateDokumentTables(MailboxUI.java:81) 
at ch.lawsuite.gui.mail.MailboxUI.initMailboxes(MailboxUI.java:37) 
at ch.lawsuite.gui.mail.MailboxUI.<init>(MailboxUI.java:23) 
at ch.lawsuite.gui.MainframeUI.initModules(MainframeUI.java:191) 
at ch.lawsuite.gui.login.LoginUI$MainframeLoader.run(LoginUI.java:131) 

Любая помощь высоко ценится. Я полностью был в тупике с этим вопросом в течение более чем недели теперь :-(

Большое спасибо заранее

+0

Это из-за «клиента», который удаленно? Если так, то что вы ожидали бы? – esej

+0

Да, исключение выбрано из удаленного автономного клиента. что объект, который лениво ассоциируется, автоматически извлекается из базы данных, когда к нему обращаются в первый раз ... Неужели я ошибаюсь в этом случае? – salocinx

ответ

2

После того, как объект передается на удаленный клиент - вы не можете загрузить ни один загруженным ленивые свойства. Вы должны убедиться, что они загружены (коснитесь их или чего-то еще) на фасаде, который передает их удаленно. Статическое плетение не имеет к этому никакого отношения. (Ну, автоматический процесс отличается со статическим/динамическим/без ткачества - но концептуально для нас как разработчиков нет никакой разницы)

+0

Большое спасибо за ваш ответ. Если я правильно понимаю, плетение предназначено только для обработки объектов между слоем базы данных и менеджером сущностей? Это связано с кэшем второго уровня? И как только объекты сериализуются и отправляются по сети, они находятся в состоянии без управления и не имеют ничего общего с типом выборки? Извините, за многие вопросы, но я думаю, что на них можно ответить в одном вопросе ;-) – salocinx

+1

Существует несколько способов реализации JPA-сущностей. Расширение (вот почему спецификация JPA (2.0 по крайней мере) требует, чтобы все entites имели открытый или защищенный конструктор по умолчанию), байт-код-инъекция-манипуляция класса (что EclipseLink вызывает это переплетение) и некоторые другие. Для EclipseLink наиболее эффективным (наиболее быстрым и т. Д.) Является плетение. Я думаю, но я не уверен, что есть несколько вещей, которые EclipseLink поддерживает только в режиме Weaved - например, кеш второго уровня. ... "находятся в состоянии без управления и не имеют никакого отношения к точке выбора типа выборки, точно вправо. – esej

+1

Теперь я думаю, чтобы понять проблему. Отдельные объекты полностью выходят из сферы действия провайдера JPA и, следовательно, требуют всестороннего и ручного управления клиентом (в случае 3-уровневого решения с автономным клиентом). Большое спасибо esej! – salocinx

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