【问题标题】:Upgrade Glassfish v2 to JPA 2.0?将 Glassfish v2 升级到 JPA 2.0?
【发布时间】:2010-10-01 15:55:38
【问题描述】:

我正在尝试在 Glassfish V2 上将 Hibernate 3.5.5 与 Spring HibernateJpaVendorAdapter 一起使用,但在初始化 Spring 上下文时出现以下异常:

java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getSharedCacheMode()Ljavax/persistence/SharedCacheMode;

在 org.hibernate.ejb.util.LogHelper.logPersistenceUnitInfo(LogHelper.java:39) 在 org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:517) 在 org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)

问题是 Glassfish V2 使用 JPA1.0,它在 Hibernate 附带的 hibernate-jpa-2.0-api-1.0.0.Final.jar 之前加载到服务器类路径上。 JPA 1.0 在 PersistenceUnitInfo 中没有 getSharedCacheModel 方法,但 JPA 2.0 有。

有没有办法升级 Glassfish V2 以使用 JPA 2.0(或任何其他解决此问题的方法)?

干杯,

J

【问题讨论】:

  • 可以选择升级到 Glassfish 3 吗?

标签: orm jpa glassfish jpa-2.0 hibernate3


【解决方案1】:

您可以尝试将 JPA 2.0 jar 放在 /domain/lib/endorsed 目录中

【讨论】:

  • 哇,我必须承认我很惊讶。我什至不明白这是如何工作的(我的意思是,不破坏容器管理的 JPA)。
  • Pascal Thivent 好吧,我认为放在那里的罐子比容器库更受欢迎。并不是说我实际使用过它(2 年前使用过 Glassfish),但我认为我可以建议它。 :)
  • 这对我不起作用。您的意思是:$GLASSFISH_HOME/domains/domain1/lib/endorsed 还是 $GLASSFISH_HOME/lib/endorsed?谢谢。
【解决方案2】:

感谢您的反馈。将 jpa jar 放入 /domain/lib/endorsed 对我有用。

设置...

<sun-web-app error-url="">
    <class-loader delegate="false"/>
</sun-web-app>

...对我不起作用,尽管这可能只是因为这些类是 javax 的一部分。

我还尝试剥离 Spring 的 JPATemplate 并直接使用 JPA @PersistenceContext EntityManager - 这会导致各种问题。 Glassfish v2 + Spring + Hibernate 不是朋友!

【讨论】:

    【解决方案3】:

    据我所知,通过简单地替换库和使用 容器管理 JPA 2.0 EntityManager 来升级 Java EE 5 容器核心 JPA 库是不可能的。

    但是,应该可以将 JPA 2.0 实现与在应用程序级别提供的 JPA 2.0 API 库一起使用,并使用 应用程序管理 JPA 2.0 EntityManager。

    要使用 GlassFish v2 尝试第二种方法,您需要关闭类加载器委托(以便首先使用应用程序库)。这可以在 sun-web.xml 中配置,您将在 WEB-INF 下打包:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sun-web-app
            PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.1 Servlet 2.4//EN"
            "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-1.dtd">
    <sun-web-app error-url="">
        <class-loader delegate="false"/>
    </sun-web-app>
    

    【讨论】:

    • 这在这种情况下不起作用,根据 Glassfish 文档:“对于许多包,包括 java.* 和 javax.*,符号解析总是委托给父类加载器,无论委托设置。这可以防止应用程序覆盖核心 Java 运行时类或更改作为 Java EE 平台一部分的规范的 API 版本。"
    【解决方案4】:

    Glassfish 2.1 不支持 JPA 2,我下载了 JPA 2 版本并粘贴到$GLASSFISH_HOME/lib/endorsed/ 目录,并粘贴到 commons-loggin1.1.jar 中,这对我有用。

    看起来像这样:

    /glassfish/lib/endorsed$ ls
    激活.jar
    openjpa-all-2.0.1.jar
    commons-logging-1.1.jar
    webservices-api.jar

    http://glassfish.java.net/public/comparing_v2_and_v3.html
    http://openjpa.apache.org/downloads.html

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多