1

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

pom.xml 中的休眠依赖项

<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 的旧版本的休眠,还是有办法强制 weblogic 使用“hibernate-jpa-2.0-api”而不是它的 jpa jar?

4

3 回答 3

2

我认为要问的更好的问题是您的类路径中是否有任何不需要的 jar,而不是是否缺少任何东西。获得一个NoSuchMethodError通常意味着您有一个库需要另一个库的特定版本,并且它最终在运行时使用的版本不是正确的版本。在您的情况下,我会ejb3-persistence.jar在您的类路径中查找,因为该错误似乎与OneToOne注释有关。在休眠状态下,您应该从中获得此信息,hibernate-jpa-2.0-api-1.0.1.Final但我的猜测是您也有OneToOne来自另一个 jar 的注释类文件。

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

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

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

Weblogic 11g 和 JavaEE 6

于 2013-05-13T14:01:06.970 回答
1

我面临同样的问题,我不得不破解 weblogic。

这就是我所做的:

首先编辑启动 weblogic server (startWebLogic.cmd)的文件,它位于如下路径:

C:\Users{username}\AppData\Roaming\JDeveloper\system11.1.2.0.38.60.17\DefaultDomain\bin 并将此行添加到文件的第 6 行。本地化

    @REM Hack JPA 开始
    echo Hack JPA 开始
    设置 wls_modules=C:\oracle\Middleware\modules
    设置 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;
    回声 PRE_CLASSPATH=%PRE_CLASSPATH%
    echo 哈克 JPA 结束
    @REM Hack JPA 结束

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

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

  • 在浏览器中转到 weblogic 控制台,通常它在 localhost:7101/console 中运行
  • 前往“JTA”
  • 选择“JPA”选项卡
  • 在“默认 JPA 提供程序”中选择“Kodo”
  • 重启weblogic服务器

以这种方式,weblogic 使用定义的具有正确版本的类的新库

于 2014-09-01T23:09:04.977 回答
1

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

于 2014-07-10T14:21:40.643 回答