我需要调用来自另一个Web应用程序的远程无状态EJB,它使用相同的glassfish( 3.1最终版本)返回实体Bean( JPA 2/Eclipselink),.Iam通过Dependancy ( @EJB )在web应用程序中获得ejb引用,但实体变为空,我搜索它,发现它可能是可序列化的问题。我在某个地方发现了这个
TopLink要么在加载时修改实体类(“编织”它们),要么在运行时替代集合访问,以便能够检测被延迟访问或修改的关系(没有这种方法无法支持延迟加载,或者在运行时对代理进行子类或使用代理)。这就引出了一个非常重要的问题:您不应该使用反射来访问一个实体,但是只有通过它的业务methods.When,才能在服务器上序列化编织实体,并在没有相应实体编织的客户端上反序列化,因为值的计算包括类字段和方法,所以序列化serialized不匹配。
那么我的应用程序需要DTO转换吗?
发布于 2011-04-11 13:47:47
你所说的“但实体变成空”是什么意思?您是在远程SessionBean上调用方法并获得返回空,还是返回其关系为null的实体?
如果它是一个空关系,它可能是一个惰性问题,如果您的关系是懒惰的,并且没有被获取或访问,那么它将是空的。您需要获取它,访问它,或者让它变得迫切。
如果您要返回null,则有其他问题。
发布于 2011-07-11 20:27:00
也许你受到了玻璃鱼虫16164的影响。
建议的解决方法是将此属性添加到persistence.xml中:
<property name="eclipselink.weaving" value="false"/>解决了我案子中的问题。
发布于 2015-01-04 17:42:15
当您试图返回一个实体时,带有EclipseLink和Glassfish的远程EJB不能正常工作。
对于Hibernate,您需要在返回响应之前删除所有代理。使用Hibernate时,您需要在删除代理之前刷新和清除持久性上下文。如果未加载,则将null设置为属性。您可以让它与Java拦截器一起工作。
但是,EclipseLink不像Hibernate那样工作。即使您清除了持久性上下文,get / set上的惰性属性也将尝试获取。甚至是外部交易。
如果您设置属性name="eclipselink.weaving“value="false",它将工作,因为EclipseLink不会更改POJO类的字节码,但是ManyToOne将始终被获取。这样就可以在内存中加载数据库。
解决这个问题的唯一方法是使用DTO或使用Hibernate和拦截器。
编辑:您可以始终使用外部化接口覆盖实体序列化。获取字段旁的objet,以确保懒散的提取不适用。
默认情况下,Openjpa似乎也使用编织方法。http://openjpa.apache.org/entity-enhancement.html
https://stackoverflow.com/questions/5546656
复制相似问题