Weblogic11g - java.lang.NoSuchMethodError:javax.persistence.OneToOne.orphanRemoval()z

时间:2013-05-13 13:39:02

标签: java hibernate jpa maven-3 weblogic11g

我知道这个问题在这里已经被问过很多次了,但是没有一个解决方案似乎对我有用。原谅我再次问这个,因为我对maven和hibernate都不熟悉。

pom.xml中的hibernate依赖

<hibernate.version>4.2.0.Final</hibernate.version>

<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-entitymanager</artifactId>
 <version>${hibernate.version}</version>
</dependency>

<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-validator</artifactId>
 <version>${hibernate.version}</version>
</dependency>

这给了我以下的罐子:

hibernate-entitymanager-4.2.0.Final
hibernate-core-4.2.0.Final
hibernate-validator-4.2.0.Final
hibernate-jpa-2.0-api-1.0.1.Final

我也有:

hibernate-commons-annotations-4.0.1.Final

但我不确定我是怎么做到的。

我正在使用一对一关系来实现类别 - 产品关系。

@Entity
@Table(name="Products")
public class Product {
   @Id    
   @Column(name="id")
   @GeneratedValue
   int productId;

   @NotEmpty
   @Length(max=50)
   @Column(name="name")
   String name;

   @Column(name="category_id")
   int categoryId;

   @OneToOne
   @ForeignKey(name="categoryId")
   private Category category;

   // getters and setters

}

编辑:

很明显,Weblogic 11g jpa jar优先于'hibernate-jpa-2.0-api'。我应该回退到使用jpa-1.0的旧版hibernate还是有一种方法可以强制weblogic使用'hibernate-jpa-2.0-api'代替它的jpa jar?

3 个答案:

答案 0 :(得分:2)

我认为更好的问题是你的类路径中是否有任何不需要的罐子,而不是你有什么遗漏。获得NoSuchMethodError通常意味着您有一个库需要另一个库的特定版本,并且它最终在运行时使用的版本不是正确的版本。在您的情况下,我会在您的类路径上查找ejb3-persistence.jar,因为它似乎与OneToOne注释有关。 Wih hibernate,你应该从hibernate-jpa-2.0-api-1.0.1.Final得到这个,但我的猜测是你还有来自另一个jar的OneToOne注释类文件。

此外,似乎其他人已经遇到过类似的问题。看看这是否有帮助:

java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z

此外,由于您似乎使用的是Weblogic 11g,这是一个JavaEE5服务器,并且与JavaEE6不兼容,而这正是hibernate-jpa-2.0 jar试图使用的。如果你要部署到weblogic 11g,你需要找到一个与它兼容的hibernate版本,我不认为4.2.0 Final是。

Weblogic 11g and JavaEE 6

答案 1 :(得分:1)

我有相同的pbl,我通过删除persistence-api-1.0.jar&amp;来解决它ejb3-persistence.jar并添加javax.persistence-2.0.0.jar。

答案 2 :(得分:1)

我遇到了同样的问题,我不得不破解weblogic。

这就是我的所作所为:

首先编辑启动weblogic服务器(startWebLogic.cmd)的文件,它位于以下路径中:

<强> C:\用户{用户名} \应用程序数据\漫游\ JDeveloper中\ system11.1.2.0.38.60.17 \默认域\ BIN 并在文件的第6行添加此行。 SETLOCAL

    @REM Hack JPA begin
    echo Hack JPA begin
    set wls_modules=C:\oracle\Middleware\modules
    set PRE_CLASSPATH=%wls_modules%\javax.persistence_1.0.0.0_2-0-0.jar;%wls_modules%\com.oracle.jpa2support_1.0.0.0_2-0.jar;
    echo PRE_CLASSPATH=%PRE_CLASSPATH%
    echo Hack JPA End
    @REM Hack JPA END

这样就可以覆盖weblogic在JPA中使用的库。

之后,在weblogic控制台中修改JPA提供程序:

  • 在浏览器中转到weblogic控制台,通常它在localhost:7101 / console中运行
  • 转到&#34; JTA&#34;
  • 选择&#34; JPA&#34;标签
  • 在&#34;默认JPA提供商&#34;选择&#34; Kodo&#34;
  • 重启weblogic服务器

通过这种方式,weblogic使用定义了具有正确版本的

版本的新库