Java-EE6:FetchType.LAZY和静态编织引发奇怪的异常

Java-EE6:FetchType.LAZY和静态编织引发奇怪的异常,java,jakarta-ee,jpa,lazy-loading,eclipselink,Java,Jakarta Ee,Jpa,Lazy Loading,Eclipselink,我的解决方案由3个不同的项目组成: 使用Netbeans自动生成的外观管理实体类和persistence.xml的EJB项目 类库,包含所有@Entity注释和静态编织的数据库类以及FacadeEJB的远程接口(在ejb和独立客户端之间共享) 主要由Swing GUI类组成的独立客户端 我使用Glassfish 3.1.2、Eclipselink 2.3作为JPA提供者、Netbeans 7.1.1和MySQL数据库。我配置了一个Ant任务,它基于persistence.xml静态地编织我的

我的解决方案由3个不同的项目组成:

  • 使用Netbeans自动生成的外观管理实体类和persistence.xml的EJB项目

  • 类库,包含所有@Entity注释和静态编织的数据库类以及FacadeEJB的远程接口(在ejb和独立客户端之间共享)

  • 主要由Swing GUI类组成的独立客户端

我使用Glassfish 3.1.2、Eclipselink 2.3作为JPA提供者、Netbeans 7.1.1和MySQL数据库。我配置了一个Ant任务,它基于persistence.xml静态地编织我的实体类

我在用fetch=FetchType.LAZY修饰的实体之间有几个@OneToOne、@ManyToOne和@manytomy注释关系

现在我明白了以下错误:

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)
线程“大型机加载程序”本地异常堆栈中的异常: 异常[EclipseLink-7242](Eclipse持久性服务-2.3.2.v20111125-r10461):org.Eclipse.Persistence.exceptions.ValidationException 异常描述:试图使用具有空会话的间接寻址遍历关系。这通常发生在具有未实例化的惰性关系的实体被序列化并且该惰性关系在序列化之后被遍历时。为了避免此问题,请在序列化之前实例化惰性关系。 位于org.eclipse.persistence.exceptions.ValidationException.instantingValueHolderWithNullSession(ValidationException.java:998) 位于org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:220) 位于org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88) 位于org.eclipse.persistence.indirection.IndirectList.buildDelegate(IndirectList.java:244) 位于org.eclipse.persistence.indirection.IndirectList.getDelegate(IndirectList.java:414) 位于org.eclipse.persistence.indirection.IndirectList.size(IndirectList.java:752) 在ch.lawsuite.gui.mail.PosteingangUI.updateDokumentTable上(PosteingangUI.java:47) 位于ch.lawsuite.gui.mail.MailboxUI.updateDokumentTables(MailboxUI.java:81) 位于ch.lawsuite.gui.mail.MailboxUI.initMailboxes(MailboxUI.java:37) 在ch.lawsuite.gui.mail.MailboxUI.(MailboxUI.java:23) 位于ch.lawsuite.gui.MainframeUI.initModules(MainframeUI.java:191) 位于ch.lawsuite.gui.login.LoginUI$MainframeLoader.run(LoginUI.java:131) 非常感谢您的帮助。我在这个问题上完全僵持了一个多星期:-(


非常感谢!

一旦实体被传递到远程客户端,您就不能加载未加载的惰性属性。您需要确保在远程传递它们的外观中加载(触摸它们或其他东西)。静态编织与此无关。(好吧,自动过程与静态/动态/无编织不同——但对于我们作为开发人员来说,概念上没有区别)

这是来自“客户机”吗这是远程的?如果是这样,您期望会发生什么?是的,异常是从远程独立客户端引发的。我期望在第一次访问数据库时,会自动从数据库中获取延迟关联的对象…在这种情况下,我的假设错了吗?非常感谢您的回答。如果我理解正确,编织只用于处理数据库层和实体管理器之间的实体?这与二级缓存有关?一旦实体序列化并通过网络发送,它们就处于非托管状态,与获取类型无关?很抱歉,有很多问题,但我认为ey所有的问题都可以用一个问题来回答;-)JPA实现可以通过几种方式“处理”实体。扩展(这就是为什么JPA(至少2.0)规范要求所有实体都有一个公共或受保护的默认构造函数)、类的字节码注入操作(EclipseLink称之为编织)还有一些其他的。对于EclipseLink来说,最高效(最快的等)是编织。我认为,但我不确定EclipseLink只在编织模式下支持几件事情-例如,二级缓存…“处于未管理状态,与获取类型无关”没错。我现在想理解这个问题了。分离的对象完全超出了JPA提供商的范围,因此需要由客户端进行全面的手动管理(如果是具有独立客户端的三层解决方案)。非常感谢esej!