您正在使用 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 规范要求非私有默认值的方式
实体的构造函数)
- Wrapping
- 类的字节码操作(使其符合 EclipseLink“想要”的方式)
- ThreadLocal 代理事物
- 使用属性的基本反射
- 使用 getter setter 的基本反射(如果有的话)
EclipseLink 将字节码注入称为“Weaving”(什么是Java字节码注入? https://stackoverflow.com/questions/3470949/what-is-java-bytecode-injection)
动态编织是在“运行时”进行编织——基本上是在类加载器加载类时。
静态编织是在部署之前、编译之后进行编织。
对于 EclipseLink 编织来说,它是性能最快的方法,而且由于其他原因它也是首选方法。不幸的是,要让编织发挥作用通常有点棘手。完全有可能这些对您的项目都不重要,对很多典型的项目也不重要。
如果有客户端通过远程接口访问 bean,并且有实体作为参数传递或通过该连接返回值,则动态编织将不起作用。
在大多数生产场景中,特别是如果应用程序/产品不是很小,静态编织无论如何都要优于动态编织......
要了解有关静态与动态编织以及如何配置它的更多信息,我还没有真正找到任何优秀的来源,但这至少是半官方的:使用_EclipseLink_JPA_Weaving http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Weaving
你所发生的情况是,该实体在一端编织,而在另一端没有编织 -> 绝对无法工作。
好消息是您可能根本不需要关心任何编织的事情,或者您可能会关心。
当您禁用编织时,EclipseLink 会退回到另一种方法来处理 JPA 实体。
有一些功能 EclipseLink 仅在启用编织时才支持(但不需要 JPA)。
From: 您可能需要了解什么关于Weaving_JPA_Entities http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#What_You_May_Need_to_Know_About_Weaving_JPA_EntitiesEclipseLink 明确使用编织的目的列表如下:
(对于其中一些方法,如果禁用编织,则可以使用其他方法,我猜除了“内部优化”之外的所有方法)