在 Spring dm Server 1.x 中使用 EclipseLink JPA 时出现 Aspectj 加载时间编织问题
Posted
技术标签:
【中文标题】在 Spring dm Server 1.x 中使用 EclipseLink JPA 时出现 Aspectj 加载时间编织问题【英文标题】:Trouble with Aspectj load-time-weaving when using EclipseLink JPA in Spring dm Server 1.x 【发布时间】:2009-10-27 02:55:19 【问题描述】:我正在尝试让 EclipseLink JPA 在 Spring dm Server OSGi 环境中工作。
从 Spring Enterprise Bundle Repository 下载的相关框架和库包括:
dm 服务器 1.0.2.SR02 AspectJ 运行时 1.6.3 AspectJ Weaver 1.6.3 Spring 框架 2.5.6.A Eclipse 持久性 1.1.0 Javax 持久性 API 1.99.0我遵循与PetClinic-1.5.0 示例中相同的结构来设置EclipseLink JPA。在启用延迟获取(需要代理对象)之前一切正常。
启用延迟获取后,以下错误表明加载时间编织无法正常工作。
----(为了便于阅读而截断)
异常 [EclipseLink-60] (Eclipse Persistence Services - 1.1.0.r3634): org.eclipse.persistence.exceptions.DescriptorException 异常描述:方法 [_persistence_setcustomer_vh] 或 [_persistence_getcustomer_vh] 未在对象 [net.fractech.fds.backoffice.Job] 中定义。 内部异常:java.lang.NoSuchMethodException:net.fractech.fds.backoffice.Job._persistence_getcu stomer_vh() 映射:org.eclipse.persistence.mappings.OneToOneMapping[客户] 描述符:RelationalDescriptor(net.fractech.fds.backoffice.Job --> [DatabaseTable(JOBS)])
这表明 _persistence_getcustomer_vh() 和 _persistence_setcustomer_vh() 方法没有自动编织到 Job 域对象中。
问题
1.) 我如何确定 load-time-weaving 是否真的有效;此外,我如何记录启动了哪个加载时间编织代理和编织器?如何将开关传递给此编织器以使其输出调试信息?
我假设我使用
2.) 许多搜索表明,我在使用 dm Server 时不需要将 -javaagent 参数传递给 jvm。这是正确的吗?
3.) 我通过断言 com.springsource.org.eclipse.persistence;version="[1.1.0,1.1.0]";import 确保我在另一个包中的域对象可以访问 Eclipse 持久性类-scope:=application 在我的 eclipselink 包中,包括 PAR 中的所有应用程序包。在 Spring dm Server 中启用 EclipseLink JPA 是否需要任何其他配置?
【问题讨论】:
【参考方案1】:我也有类似的问题。首先尝试设置 eclipselink.weaving.lazy=false 或 eclipselink.weaving=false 如果不起作用。我必须设置后者。
如果您想参考我使用的设置来查看它是否适用于您,我的网站上有一篇关于它的帖子。
【讨论】:
【参考方案2】:最好使用Equinox Waving Springwaver
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
...
<property name="loadTimeWeaver">
<bean class="org.eclipse.equinox.weaving.springweaver.EquinoxAspectsLoadTimeWeaver"/>
</property>
</bean>
你不需要使用 -javaagent 选项。
您可以在此处http://code.google.com/p/springdm-in-action/ 找到使用 JPA 和 EclipseLink 的工作示例(参见第 7 章)。
【讨论】:
【参考方案3】:我曾尝试将 EquinoxAspectsLoadTimeWeaver 用于 JPa 上下文(使用 EclipseLink),但如果您的 EquinoxAspectsLoadTimeWeaver bean 声明未在与模型包相同的包中完成,它不会转换模型类。
EquinoxAspectsLoadTimeWeaver 转换类仅适用于存储在声明 EquinoxAspectsLoadTimeWeaver 的包中的类。
我已经尝试了示例http://code.google.com/p/springdm-in-action/(参见第 7 章)(感谢 Lukasz 示例)。 EquinoxAspectsLoadTimeWeaver 的声明避免了错误
Caused by: java.lang.IllegalStateException: Cannot apply class transformer without LoadTimeWeaver specified
但是模型类没有被转换(编织)。织入 EclipseLink 管理例如惰性模式。例如,如果您将示例模型设置为 Contact 惰性模式,如下所示:
public class Contact
...
@Column(name="last_name")
@Basic(fetch=FetchType.LAZY)
private String lastName;
你会注意到没有应用延迟加载,因为 Model Contact 类不是 wowen。
问候安吉洛
【讨论】:
我已经更新了 Martin Lippert Springweaver 包来管理 JPA/Eclipselink。请参阅angelozerr.wordpress.com/2010/04/30/springweaver_step1 您会找到有关 Martin Lippert Springweaver 问题的解释,我已尝试解释如何解决它。 JPA/Eclipselink 也有一个示例,我将在另一篇文章中解释。问候安吉洛以上是关于在 Spring dm Server 1.x 中使用 EclipseLink JPA 时出现 Aspectj 加载时间编织问题的主要内容,如果未能解决你的问题,请参考以下文章