3

调用从客户端传递方法参数的会话 bean 方法时遇到问题

应用程序中,数据到达方法调用时始终为空或设置为默认值。

而该方法的过程与对象很好地配合

例如:

- 我们有方法来持久化一个对象实体 addStudent(Student student); - 从客户端我们创建学生对象设置学生字段,如学生姓名等,调用方法 addStudent(ourStudent); 这个 ourStudent 到达方法的字段为 null 或默认值。学生被添加到这些空字段中。

提前致谢。

4

1 回答 1

6

您将 EclipseLink 与编织一起使用,但它不起作用。你应该尝试不编织。可能通过编辑你的persistence.xml(s)

<persistence-unit name="XXX" transaction-type="XXX">
    <jta-data-source>XXX</jta-data-source>
    <jar-file>Or List of Classes or something else</jar-file>
    <properties>
      [other properties]
      <property name="eclipselink.weaving" value="false"/>
    </properties>
  </persistence-unit>

更新:JPA 实现可以通过多种替代方式处理实体,这是一个不厌其烦的列表:

  • 扩展(这是 JPA 规范要求实体的非私有默认构造函数的方式)
  • 包装
  • 类的字节码操作(使其符合 EclipseLink “想要”的方式)
  • ThreadLocal 代理事物
  • 使用属性的基本反射
  • 使用 getter setter 的基本反射(如果有的话)

EclipseLink 调用字节码注入“编织”(什么是 Java 字节码注入?)动态编织是在“运行时”进行编织 - 基本上是当类由类加载器加载时。静态编织是在部署之前进行编织,但在编译之后。对于 EclipseLink weaving 是最快的方法性能明智,它也是其他原因的首选方法。不幸的是,让编织工作通常有点棘手。完全有可能这对您的项目无关紧要,对于很多典型项目来说都无关紧要。

如果有客户端通过远程接口访问 bean,并且有实体作为参数传递或通过该连接返回值,则动态编织将不起作用。在大多数生产场景中,特别是如果应用程序/产品不是非常小,静态编织比动态编织更受欢迎......要阅读更多关于静态与动态编织以及如何配置它的信息,我还没有真正找到任何优秀的资源,但这至少是半官方的: Using_EclipseLink_JPA_Weaving

发生在你身上的是实体是在一端编织而不是在另一端编织 -> 绝对不能工作。

好消息是,您可能根本不必关心这些编织物,或者您可能会。当您禁用编织时,EclipseLink 会退回到另一种处理 JPA 实体的方法。EclipseLink 仅在启用编织时才支持某些功能(尽管不需要 JPA)。

来自:What_You_May_Need_to_Know_About_Weaving_JPA_Entities 列出了 EclipseLink 明确使用编织的内容:

  • 延迟加载(间接)
  • 变更跟踪
  • 获取组
  • 内部优化

(对于其中一些方法,如果禁用编织,则可以回退到其他方法,我猜除了“内部优化”之外的所有方法)

于 2012-06-05T10:18:57.553 回答