代码之家  ›  专栏  ›  技术社区  ›  Marty Pitt

Hibernate 3.5.x:NoSuchMethodError:javax.persistence.OneToMany.ornin删除

  •  12
  • Marty Pitt  · 技术社区  · 15 年前

    我正在尝试升级到Hibernate 3.5.3-FINAL。

    java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z   
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1837)
    

    我的类路径包含以下JAR:

    从hibernate dist:

    antlr-2.7.6.jar
    commons-collections-3.1.jar
    dom4j-1.6.1.jar
    javassist-3.9.0.GA.jar
    jta-1.1.jar
    slf4j-api-1.5.8.jar
    
    cglib-2.2.jar
    hibernate-jpa-2.0-api-1.0.0.Final.jar
    hibernate3.jar
    

    其他罐子:

    blazeds-common-3.2.0.3978.jar
    blazeds-core-3.2.0.3978.jar
    blazeds-opt-3.2.0.3978.jar
    blazeds-proxy-3.2.0.3978.jar
    blazeds-remoting-3.2.0.3978.jar
    commons-lang-2.3.jar
    dbunit-2.4.7.jar
    ejb3-persistence.jar // Note, I've tried excluding this, but I get different errors
    guava-r05.jar
    hsqldb-1.8.0.7.jar
    junit-4.1.jar
    lambdaj-2.0-with-dependencies.jar
    log4j-1.2.14.jar
    mockito-all-1.8.0.jar
    persistence-api-1.0.jar
    spring-security-core-2.0.0.jar
    spring.jar
    sqljdbc.jar
    

    我已经研究过了,我 find answers 我的Web服务器必须符合JPA2:

    不幸的是,如果你的应用服务器 不符合jpa2,您很可能 运气不好

    此项目是一个库,而不是Web服务器项目(虽然它最终被部署到一个web服务器上,但我只是在这里运行单元测试)

    我错过了什么?

    <indulgent_rant>

    顺便说一句,每次升级Hibernate时,我发现自己都要花上几个小时来研究相互冲突的jar MethodNotFoundException ClassNotFoundException 的。一定有更简单的方法?

    我确信随着他们宣布将模块合并回一个核心项目,这些冲突会消失吗?

    </indulgent_rant>

    6 回复  |  直到 15 年前
        1
  •  21
  •   Pascal Thivent    15 年前

    正如Timo所指出的,移除 persistence-api-1.0.jar

    以防万一,以下是我使用的依赖项:

    org.hibernate:hibernate-entitymanager:jar:3.5.3-Final:compile
    +- org.hibernate:hibernate-core:jar:3.5.3-Final:compile
    |  +- antlr:antlr:jar:2.7.6:compile
    |  +- commons-collections:commons-collections:jar:3.2:compile
    |  +- dom4j:dom4j:jar:1.6.1:compile
    |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
    |  \- javax.transaction:jta:jar:1.1:compile
    +- org.hibernate:hibernate-annotations:jar:3.5.3-Final:compile
    |  \- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile
    +- cglib:cglib:jar:2.2:compile
    |  \- asm:asm:jar:3.1:compile
    +- javassist:javassist:jar:3.9.0.GA:compile
    \- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile
    

    我是从我生命中的一份声明中得到的 pom.xml

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>3.5.3-Final</version>
    </dependency>
    

    这应该以某种方式回答你的放纵的咆哮(如果我换一句话:使用Maven-或者知道你在做什么)。

        2
  •  10
  •   Manish Jaiswal    15 年前

    从项目库位置删除这些文件 持久性-api-1.0.jar

    仅添加 javax.persistence-2.0.0.jar

    它包含所有必需的字段和属性。

    试试这个,它会解决你的问题的。

    曼尼什监狱

        3
  •  3
  •   Timo Westkämper    15 年前

        4
  •  3
  •   Marko cyn    13 年前

    发现了一个解决这个问题的方法,至少我正在使用的是:ibmwebsphere7和myeclipseblue(Spring),或者Bling,ver。10.6. 我创建了一个依赖于其他项目的应用程序,其中一个使用hibernate3.6.3,需要jpa2.0。ibmws在jpa2.0之前加载jpa1.0以支持自己,并将所有对JPA的引用解析为ver。1.0. 对于ibmws,这会导致上面报告的错误。从现在起,我遇到的唯一修复包括添加JPA 2.0作为共享库,然后将服务器设置为在其本机类之前加载该库,类似于这里讨论的方法:

    http://www.mkyong.com/websphere/websphere-7-javaxpersistenceonetomany-orphanremoval-error/

    但是我们的服务器管理员不允许更改服务器范围的类加载器策略。所以我仍然需要找到一种方法让我的项目使用jpa2.0而不是1.0。我试了很多东西,但最后还是去买了冰雹玛丽,它成功了。

    修复方法是将jpa2.0.jar文件添加到.war和.ear项目中,然后在.war和.ear项目的清单文件中编辑类路径行,以指向.jar文件。似乎它们必须同时存在,否则方法将不起作用,因此jpa2.0.jar必须同时存在于.war和.ear中。

    在应用程序(.war项目)中,将hibernate-jpa-2.0-api-1.0.0.Final.jar添加到项目根目录中。MyEclipse Blue将在该位置显示为一个文件,并在Package Explorer视图的“Referenced Libraries”下列出。然后打开位于/WebRoot/META-INF/manifest.MF的清单文件,确保类路径行显示:

    Class-Path: /hibernate-jpa-2.0-api-1.0.0.Final.jar
    

    在.ear项目中,将hibernate-jpa-2.0-api-1.0.0.Final.jar添加到项目根目录下的“lib”文件夹中。如果没有“lib”文件夹,请创建一个。然后在/META-INF/MANIFEST.MF中,确保类路径行显示:

    Class-Path: /lib/hibernate-jpa-2.0-api-1.0.0.Final.jar
    

    "Applications\Application Types\Websphere enterprise applications" 单击应用程序的名称,然后单击“类加载和 update detection" . 然后选择 "Classes loaded with local class loader first (parent last)" "Class loader order" Apply ,那么 Save . 现在回到click trail “应用程序\应用程序类型\ Websphere企业应用程序” ,启动或重新启动应用程序。测试你的应用程序,希望你能很好地去。

    最后说明: 每次重新部署.ear文件时,都需要设置我刚才讨论的classloader选项。部署之间不保留首选项。

        5
  •  1
  •   Amit P    14 年前

    添加javax.persistence-2.0.0.jar应该可以正常工作。。。

        6
  •  0
  •   Kabron    12 年前

    只要确保EAR中包含hibernate-jpa-2.0-api jar文件,将服务器的应用程序类加载器策略设置为parent last就可以解决这个问题。如果这在您的环境中是可能的,那么这是一个更简单的解决方案。