使用GlassFish 4 / EclipseLink延迟加载@ManyToOne关系失败

时间:2013-09-13 10:03:06

标签: jpa glassfish eclipselink

GlassFish 4(实际上是它的JPA实现,即EclipseLink)无法从我们的Java EE 7应用程序延迟加载@ManyToOne JPA关系。默认/急切加载是可以的,但不是延迟加载。

“学生”实体中的关系是:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "addr_id")
private Address address;

(简化)persistence.xml如下所示:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">
    <persistence-unit name="foo-PU" transaction-type="JTA">
        <jta-data-source>jdbc/foo-DS</jta-data-source>
        <class>foo.domain.Student</class>
        <class>foo.domain.Address</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.target-database" value="PostgreSQL"/>
            <property name="eclipselink.logging.level" value="FINE"/>
        </properties>
    </persistence-unit>
</persistence>

该应用程序使用了几个API:PrimeFaces,JSF 2.2,CDI 1.1,JPA 2.1。

另请注意,EntityManager不是通过注入会话EJB获得的,而是使用Persistence.createEntityManagerFactory(...)然后emf.createEntityManager(...)手动创建的。

错误消息是:

WARNING:   Reverting the lazy setting on the OneToOne or ManyToOne attribute [address] for the entity class [class foo.domain.Student] since weaving was not enabled or did not occur.

我的理解是,由于某种原因,未启用实体的动态编织。对于Java EE应用程序,它应该是http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Performance/Weaving所建议的。

对于记录,如果我们尝试使用此强制编织:

<property name="eclipselink.weaving" value="true"/>
在persistence.xml中

,然后我们得到另一条错误消息:

SEVERE:   Error Rendering View[/student/studentList.xhtml]
javax.el.ELException: /student/studentList.xhtml @24,81 value="#{studentController.selectedCode}": Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: WebappClassLoader (delegate=true; repositories=WEB-INF/classes/)
Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28022] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Value [true] for the property [eclipselink.weaving] is incorrect when global instrumentation is null, value should either be null, false, or static.
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIOutput.getValue(UIOutput.java:174)
at javax.faces.component.UIInput.getValue(UIInput.java:291)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
(...)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)

知道如何解决这个延迟加载问题吗?为什么默认情况下不启用动态编织?

感谢。

1 个答案:

答案 0 :(得分:0)

如果将eclipselink.weaving设置为true,则意味着您要动态地编织实体类。为此,您需要使用适当的javaagent运行jvm。首先下载一个代理

wget -O /tmp/eclipselink.jar \
https://repo1.maven.org/maven2/org/eclipse/persistence/eclipselink/2.7.7/eclipselink-2.7.7.jar

,然后使用以下代码段运行您的应用程序

java -javaagent:/tmp/eclipselink.jar ....

但是,如果将eclipselink.weaving设置为static,则会通知jpa您要静态地编织实体类。当然,您必须使用此Maven插件https://github.com/craigday/eclipselink-staticweave-maven-plugin

来触发挥舞动作