2

我试图让 EclipseLink JPA 在 Spring dm Server OSGi 环境中工作。

从 Spring Enterprise Bundle Repository 下载的相关框架和库包括:

  • dm 服务器 1.0.2.SR02
  • AspectJ 运行时 1.6.3
  • AspectJ 韦弗 1.6.3
  • Spring 框架 2.5.6.A
  • Eclipse 持久性 1.1.0
  • Javax 持久性 API 1.99.0

我遵循与PetClinic-1.5.0示例中介绍的相同结构来设置 EclipseLink JPA。一切正常,直到启用延迟获取(这需要代理对象)。

启用延迟获取后,以下错误表明 load-time-weaving 无法正常工作。

---- (为便于阅读而截断)

异常 [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[customer] 描述符:RelationalDescriptor(net.fractech.fds.backoffice.J ob --> [DatabaseTable(JOBS)])


这表明 _persistence_getcustomer_vh() 和 _persistence_setcustomer_vh() 方法没有自动编织到 Job 域对象中。

问题

1.) 我如何确定 load-time-weaving 是否真的有效;此外,我如何记录启动了哪个加载时间编织代理和编织器?如何将开关传递给此编织器以使其输出调试信息?

我假设我从 <context:load-time-weaver aspectj-weaving="on" /> 开始加载时间编织

2.) 很多搜索显示我在使用dm Server时不需要将-javaagent参数传递给jvm。这个对吗?

3.) 我通过断言 com.springsource.org.eclipse.persistence;version="[1.1.0,1.1.0]";import-scope 确保我在另一个包中的域对象可以访问 Eclipse 持久性类: =我的 eclipselink 包中的应用程序,并包括 PAR 中的所有应用程序包。在 Spring dm Server 中启用 EclipseLink JPA 是否需要任何其他配置?

4

3 回答 3

2

我有类似的问题。首先尝试设置 eclipselink.weaving.lazy=false 或 eclipselink.weaving=false 如果不起作用。我不得不设置后者。

如果您想参考我正在使用的设置来查看它是否适用于您,我在我的网站上有一篇关于它的帖子。

于 2009-12-23T09:28:49.627 回答
1

最好使用 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 章)。

于 2010-03-02T20:32:53.243 回答
0

我曾尝试将 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。

问候安吉洛

于 2010-04-28T09:42:13.327 回答