【问题标题】:java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index; inspite of hibernate-jpa-2.1.jar in classpathjava.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;尽管类路径中有 hibernate-jpa-2.1.jar
【发布时间】:2018-10-02 17:14:03
【问题描述】:

我知道这个问题已经有了答案,但我无法解决我的问题。

我在类路径中有 hibernate-commons-annotations-5.0.1.Final.jar、hibernate-core-4.3.5.Final.jar、hibernate-jpa-2.1-api-1.0.0.final.jar。

以下是我的 HibernateUtil 代码:

public class HibernateUtil {

private static SessionFactory sessionAnnotationFactory;

private static SessionFactory buildSessionAnnotationFactory() {
    try {
        // Create the SessionFactory from hibernate-annotation.cfg.xml
        Configuration configuration = new Configuration();
        configuration.configure("hibernate-annotation.cfg.xml");
        System.out.println("Hibernate Annotation Configuration loaded");
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        System.out.println("Hibernate Annotation serviceRegistry created");
        SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        return sessionFactory;
    } catch (Throwable ex) {
        // Make sure you log the exception, as it might be swallowed
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionAnnotationFactory() {
    if (sessionAnnotationFactory == null) sessionAnnotationFactory = buildSessionAnnotationFactory();
    return sessionAnnotationFactory;
}

}

我仍然收到以下错误:

初始 SessionFactory 创建失败.java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;

引起:java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;在 org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:936) 在 org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:824) 在 org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3788) 在 org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3742) 在 org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) 在 net.deldot.util.HibernateUtil.buildSessionAnnotationFactory(未知 来源)在 net.deldot.util.HibernateUtil.getSessionAnnotationFactory(未知 来源)

如果有帮助,我正在使用 IntelliJ。它不是一个 Maven 项目。我没有使用jboss。没有 glassfish jars。我读过其他答案说这个错误是由于 hibernate-jpa-2.1-api-1.0.0.final.jar 和 hibernate-jpa-2.0-api-1.0.0.final.jar 冲突而发生的.但是我在项目中的任何地方都没有看到 hibernate-jpa-2.0 jar。我不知道哪个 jar 与 hibernate-jpa-2.1 jar 冲突。如何检查?

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    您正在使用 Hibernate 5 中的 hibernate-commons-annotations-5.0.1.Final.jar 和 Hibernate 4 中的 hibernate-core-4.3.5.Final.jar。这是不正确的。

    带有Table#indexes()方法的@Table注解应该在hibernate-jpa-2.1-api-1.0.0.Final.jar

    https://stackoverflow.com/a/35569978/3405171

    您可以尝试使用这种方法检查旧的@Table 注释来自哪里

    https://stackoverflow.com/a/37409315/3405171

    请使用 Maven 或 Gradle。

    【讨论】:

    • 用 hibernate-commons-annotations-4.0.1.Final.jar 替换 hibernate-commons-annotations-5.0.1.Final.jar 没有帮助。我在一个类中添加了@Table(indexes = {}),它确实指向 hibernate-jpa-2.1-api-1.0.0.Final.jar。
    • 这是一个老项目,我的任务是用 Hibernate 替换旧的 jdbc 代码。这不是一个 Maven 项目,但我想我可以将它转换为 Maven,但我不确定我会遇到什么问题。
    • @Ram 我在一个类中添加了@Table(indexes = {}),它确实指向了hibernate-jpa-2.1-api-1.0.0.Final.jar。 是的。但这并不意味着 @Table 注释在运行时来自该库。您可以使用第二个链接中的类加载器示例进行检查。
    • 感谢您将我指向链接以查找在运行时加载的 jar。原来,它来自 /C:/oracle/Middleware/Oracle_Home/oracle_common/modules/javax.persistence_2.0.0.0_2-0.jar!/javax/persistence/Table.class。
    • 所以,我尝试为我的 weblogic 安装启用 jpa2.1 支持,如 docs.oracle.com/middleware/1213/wls/EJBAD/… 中所述。我按照建议对 commEnv.cmd 进行了更改,启动了 weblogic 服务器。服务器控制台确实显示 CLASSPATH=C:\oracle\Middleware\Oracle_Home\oracle_common\modules\javax.persistence_2.1.jar:C:\oracle\Middleware\Oracle_Home\wlserver\modules\com.oracle.weblogic.jpa21support_1.0.0 .0_2-1.jar;在重新启动时,但是当我再次运行我的应用程序时,我看到 @Table 正在从同一个 jpa2.0 jar 加载:(
    【解决方案2】:

    好的,这不是最好的解决方案,而是一种解决方法。由于无法启用 weblogic 对 JPA2.1 的支持,所以我将 Hibernate-core-4.3.5.Final.jar 替换为 Hibernate-core-4.2.21.Final.jar(Hibernate 4.3.0 中引入了 JPA2.1 支持)。不再出现该错误。

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 2014-01-11
      • 2016-06-15
      相关资源
      最近更新 更多