【问题标题】:Calling Remote EJB in EJB 3.1在 EJB 3.1 中调用远程 EJB
【发布时间】:2011-04-05 02:46:56
【问题描述】:

我需要从另一个具有相同 glassfish(3.1 最终版本)的 Web 应用程序调用远程无状态 EJB,它返回实体 Bean(JPA 2/Eclipselink)。我通过 依赖注入 在 Web 应用程序中获取 ejb 引用> ( @EJB ) 但实体变为空。我用谷歌搜索它,发现它可能是 Serializable 问题。我在某个地方找到了这个

TopLink 要么修改实体类 (“编织”它们)负载或替代品 运行时的集合访问是 能够检测到延迟访问或 修改后的关系(没有 没有这个支持延迟加载的方法 或子类化或使用代理 运行)。这给我们带来了一个非常 重点:你不应该使用 反射以访问实体,但是 仅通过其业务方法。当一个 编织实体在 服务器并在客户端反序列化 没有对应的 实体编织,serialVersionUIDs 与计算不匹配 值包括类字段和 方法。

所以我需要在我的应用程序上进行 DTO 转换吗???

【问题讨论】:

    标签: jpa ejb-3.1 toplink


    【解决方案1】:

    “但实体变为空”是什么意思?是调用远程SessionBean上的方法返回null,还是返回和关系为null的Entity?

    如果是空关系,则可能是 LAZY 问题,如果您的关系是 LAZY,并且尚未获取或访问,那么它将为空。您需要获取它、访问它或使其成为 EAGER。

    如果您返回 null,则说明有其他问题。

    【讨论】:

    • 我正在获取实体 null,即使它被提取为渴望。
    【解决方案2】:

    也许你受到Glassfish bug 16164的影响。

    建议的解决方法是将此属性添加到 persistence.xml:

    <property name="eclipselink.weaving" value="false"/>
    

    这解决了我的问题。

    【讨论】:

      【解决方案3】:

      当您尝试返回实体时,使用 EclipseLink 和 Glassfish 的远程 EJB 无法正常工作。

      Hibernate 也是如此,您需要在返回响应之前删除所有代理。 使用 Hibernate,您需要在删除代理之前刷新和清除持久性上下文。如果未加载,则将 null 设置为属性。您可以使用 Java EE 拦截器使其工作。

      但是,EclipseLink 不像 Hibernate 那样工作。即使您清除了持久性上下文,get / set on lazy 属性也会尝试获取。甚至是外部交易。

      如果您设置属性名称="eclipselink.weaving" value="false",它将起作用,因为 EclipseLink 不会更改您的 POJO 类的字节码,但会始终获取 ManyToOne。因此它可以将数据库加载到内存中。

      我解决这个问题的唯一方法是使用 DTO 或使用带有拦截器的 Hibernate。

      编辑:您始终可以使用外部化接口覆盖实体序列化。通过字段获取对象以确保惰性提取不适用。

      Openjpa 似乎也默认使用编织方法。 http://openjpa.apache.org/entity-enhancement.html

      【讨论】:

        猜你喜欢
        • 2012-02-26
        • 1970-01-01
        • 2012-11-03
        • 1970-01-01
        • 2014-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多