Lazy loading of @ManyToOne relation fails with GlassFish 4 / EclipseLink

♀尐吖头ヾ 提交于 2020-08-27 21:43:11

问题


GlassFish 4 (actually its JPA implementation, i.e. EclipseLink) fails to lazy load a @ManyToOne JPA relation from our Java EE 7 application. Default/eager loading is ok, but not lazy loading.

The relation in the 'Student' entity is:

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

The (simplified) persistence.xml looks like:

<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>

The application uses several API: PrimeFaces, JSF 2.2, CDI 1.1, JPA 2.1.

Also note that the EntityManager are not obtained by injection into session EJB, but manually created using Persistence.createEntityManagerFactory(...) then emf.createEntityManager(...).

The error message is:

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.

My understanding is that, for some reason, the dynamic weaving of entities is not enabled. For a Java EE application it should be, as suggested by http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Performance/Weaving.

For the record, if we try to force the weaving using this:

<property name="eclipselink.weaving" value="true"/>

in the persistence.xml, then we get another error message:

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)

Any idea how to fix this lazy-loading issue? Why is the dynamic weaving not enabled by default ?

Thanks.


回答1:


If you set eclipselink.weaving to true it means that you want to weave an entity classes dynamically. To make this work you need to run a jvm with a proper javaagent. First download an agent

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

and then run your app using following snippet

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

But if you set eclipselink.weaving to static then you inform jpa that you want to weave the entity classes statically. Of course you have to trigger the waving by your own for example using this maven plugin https://github.com/craigday/eclipselink-staticweave-maven-plugin



来源:https://stackoverflow.com/questions/18783566/lazy-loading-of-manytoone-relation-fails-with-glassfish-4-eclipselink

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!