gpt4 book ai didi

jpa - OpenJPA 是否适用于 Glassfish?

转载 作者:行者123 更新时间:2023-12-04 17:04:20 24 4
gpt4 key购买 nike

有人成功使用 OpenJPA 和 Glassfish 吗?

我正在尝试将 OpenJPA 2.1 与 Glassfish 3.1 开源一起使用。我已按照说明在此处集成两者 -> http://weblogs.java.net/blog/ss141213/archive/2006/07/using_openjpa_a.html

我在 Eclipse Indigo 中有一个非常简单的 EJB 项目,其中包含以下内容:

  • com.rares.test.Person - @Entity
  • com.rares.test.PersonManager - 接口(interface)
  • com.rares.test.PersonDao - @Stateless

  • 但是,当我尝试部署时,我的 Person @Entity 上出现 ClassNotFoundException。投诉似乎是在我的 PersonDao 中实现的 create 方法的 Person 参数(请参阅下面的所有代码)。

    我已经尝试了相同的项目,但没有在我的 persistence.xml 中指定提供者,并且项目运行良好(能够将 Person @Entity 持久保存到 MySql 中的 PERSON 表中)。如果我没有指定提供者,我想我正在使用 EclipseLink(如果我错了,请纠正我)。这让我相信我没有用 Glassfish 正确配置 OpenJPA。

    堆栈跟踪
    Caused by: java.lang.IllegalArgumentException: java.lang.ClassNotFoundException: com.rares.test.Person
    at serp.util.Strings.toClass(Strings.java:164)
    at serp.util.Strings.toClass(Strings.java:108)
    at serp.bytecode.BCClass.getType(BCClass.java:566)
    at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:283)
    at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:254)
    at org.apache.openjpa.enhance.PCClassFileTransformer.transform0(PCClassFileTransformer.java:144)
    at org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:124)
    at org.apache.openjpa.persistence.PersistenceProviderImpl$ClassTransformerImpl.transform(PersistenceProviderImpl.java:294)
    at org.glassfish.persistence.jpa.ServerProviderContainerContractInfo$1.transform(ServerProviderContainerContractInfo.java:98)
    at com.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:742)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
    at java.lang.Class.privateGetPublicMethods(Class.java:2547)
    at java.lang.Class.getMethods(Class.java:1410)
    at com.sun.enterprise.deployment.EjbDescriptor.addAllInterfaceMethodsIn(EjbDescriptor.java:2327)
    at com.sun.enterprise.deployment.EjbDescriptor.getLocalRemoteBusinessMethodDescriptors(EjbDescriptor.java:2290)
    ... 40 more

    com.rares.test.Person
    @Entity
    @Table (name="PERSON")
    public class Person implements Serializable {
    private static final long serialVersionUID = 3707476467775531463L;

    @Id
    @GeneratedValue (strategy=GenerationType.IDENTITY)
    @Column private Long id;
    @Column private String name;

    com.rares.test.PersonManager
    public interface PersonManager {
    void create (com.rares.test.Person p);
    }

    com.rares.test.PersonDao
    @Stateless
    public class PersonDao implements PersonManager {
    @PersistenceContext (unitName="RarePersistUnit")
    protected EntityManager mgr;

    @Override
    public void create(com.rares.test.Person p) {
    mgr.persist(p);
    }

    }

    持久性.xml
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="RarePersistUnit">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <jta-data-source>jdbc/RaresMySql</jta-data-source>
    <class>com.rares.test.Person</class>
    <properties>

    </properties>
    </persistence-unit>
    </persistence>

    最佳答案

    注意:以下假设 OpenJPA 2.1 Glassfish 3.1 .结果可能因两者的版本而异。

    抛出的异常是执行失败的典型 bytecode enchancement在运行时由 OpenJPA。字节码增强可以在构建时或运行时完成。获得运行时支持的更好选择之一是使用 javaagent但需要一些古怪的配置:

  • 它要求您指定 javaagent在 Glassfish 域配置文件中(通过在 jvm-options 元素下指定额外的 java-config 元素),
  • 并从默认值 ${com.sun.aas.installRoot}/modules/glassfish.jar 修改类路径包括commons-lang-2.4.jar (我没有费心去做,因为它会导致一个非常脆弱的设置)。

  • 可以在运行时使用的其他选项非常不稳定,使用 Serp 的选择因为字节码增强器是部署时引发异常的原因。显然,部署时间增强无法定位持久性上下文中使用的类,因为使用了不正确的类加载器来定位类。就我而言,Glassfish EarClassLoaderEarLibClassLoader类加载器用于在两个单独的调用中加载类,都失败并显示以下消息(堆栈跟踪在这里无关紧要):
    WARNING: LDR5207: ASURLClassLoader EarLibClassLoader : 
    doneCalled = true
    doneSnapshot = ASURLClassLoader.done() called ON EarLibClassLoader :
    urlSet = []
    doneCalled = false
    Parent -> org.glassfish.internal.api.DelegatingClassLoader@10e3c8c
    AT Sun Jul 17 13:27:54 IST 2011
    BY :java.lang.Throwable: printStackTraceToString
    at com.sun.enterprise.util.Print.printStackTraceToString(Print.java:639)
    at com.sun.enterprise.loader.ASURLClassLoader.done(ASURLClassLoader.java:211)
    ...

    ...

    WARNING: LDR5207: ASURLClassLoader EarClassLoader :
    doneCalled = true
    doneSnapshot = ASURLClassLoader.done() called ON EarClassLoader :
    urlSet = [URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-jsf-0.0.1-SNAPSHOT_war/WEB-INF/classes/, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-jsf-0.0.1-SNAPSHOT_war/WEB-INF/lib/commons-fileupload-1.2.1.jar, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-jsf-0.0.1-SNAPSHOT_war/WEB-INF/lib/commons-io-1.4.jar, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-jsf-0.0.1-SNAPSHOT_war/WEB-INF/lib/primefaces-3.0.M2.jar, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/generated/ejb/app-ear/app-jsf-0.0.1-SNAPSHOT_war/, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-ejb-0.0.1-SNAPSHOT_jar/, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/generated/ejb/app-ear/app-ejb-0.0.1-SNAPSHOT_jar]
    doneCalled = false
    Parent -> org.glassfish.internal.api.DelegatingClassLoader@1a3fe65
    AT Sun Jul 17 13:27:54 IST 2011
    BY :java.lang.Throwable: printStackTraceToString
    at com.sun.enterprise.util.Print.printStackTraceToString(Print.java:639)
    at com.sun.enterprise.loader.ASURLClassLoader.done(ASURLClassLoader.java:211)
    ...

    ...

    显然,由于某种未知原因,为 EJB 生成的类区域在运行时不包含 JPA 实体类,导致在部署时无法定位类。失败的最可能原因是实体类虽然封装在 EJB 模块中,但它们本身可能没有放在生成的类目录中;只有带注释的 EJB 类可能已放置在那里。

    因此,唯一合理的选择是使用构建时间增强,这是使用 Maven POM 中的以下配置适当完成的:
     <build>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <executions>
    <execution>
    <phase>process-classes</phase>
    <configuration>
    <tasks>
    <taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask" classpathref="maven.compile.classpath"/>
    <openjpac>
    <classpath refid="maven.compile.classpath"/>
    </openjpac>
    </tasks>
    </configuration>
    <goals>
    <goal>run</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </pluginManagement>
    </build>

    上述配置源自 enhancing classes with Maven 上的 OpenJPA 文档.请注意,我没有使用 openjpa-maven-plugin ,因为在撰写本文时,OpenJPA 2.2.0 版仅作为快照提供。

    当然,以上任何一项都需要在 Glassfish 3.1 中安装 OpenJPA 2.1,这是通过将以下 JAR 复制到 ${com.sun.aas.installRoot}/glassfish/lib 来完成的。 (例如, C:/glassfishv3/glassfish/lib),而不是在较早的博客文章中提供的复制到 ${com.sun.aas.instanceRoot}/lib 的建议(例如, C:/glassfishv3/glassfish/domains/domain1/lib)
  • commons-beanutils-1.8.3.jar
  • commons-collections-3.2.1.jar
  • commons-dbcp-1.4.jar
  • commons-lang-2.4.jar
  • commons-logging-1.0.4.jar
  • commons-pool-1.5.4.jar
  • serp-1.13.1.jar
  • openjpa-2.1.0.jar

  • 显然,将这​​些 JAR 放在 ${com.sun.aas.instanceRoot}/lib导致无法通过 Maven Glassfish 插件部署应用程序。

    OpenJPA 2.1 发行版中存在的其他 JAR( geronimo-*derby-*org.apache.bval*)由 Glassfish 3.1 作为 Java EE 6 SDK、Java DB 实现或 Derby 客户端的一部分提供,并且在 JSR 303 中提供bean 验证框架(Hibernate Validator)。

    关于jpa - OpenJPA 是否适用于 Glassfish?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6721962/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com