休眠 5 - java.lang.NoSuchMethodError: javax.persistence.Table.indexes()

Posted

技术标签:

【中文标题】休眠 5 - java.lang.NoSuchMethodError: javax.persistence.Table.indexes()【英文标题】:Hibernate 5 - java.lang.NoSuchMethodError: javax.persistence.Table.indexes() 【发布时间】:2018-11-07 11:37:00 【问题描述】:

我正在尝试使用休眠注释测试一些 POJO,并且我不断地遇到相同的错误。我在另一个项目中使用了相同的配置,一切正常。我测试了测试 hib 对象时使用的 jdbc 连接 - 并且连接工作正常。

我发现了一些其他关于相同错误的问题,但没有任何帮助。

main方法测试类代码:

public static void main(String[] args) 

    SessionFactory factory = new Configuration()
            .configure("hibernate.cfg.xml")
            .addAnnotatedClass(Item.class)
            .buildSessionFactory();

    //create session
    Session session = factory.getCurrentSession();

    try 

        session.beginTransaction();

        List<Item> items = session.createQuery("from items").list();

带有休眠注解的 POJO:

@Entity
@Table(name="items")
public class Item 

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @Column(name="price")
    private double price;

    @Column(name="stock")
    private int stock;

    public Item() 
    

    public Item(String name, double price) 
    this.name = name;
    this.price = price;
    

下面是每个实体的getter和setter。

文件 hibernate.cfg.xml 与另一个项目中的同一文件具有相同的配置,其中连接和休眠代码工作得非常好 - 正如上文所述,连接在单独的类中进行了测试。

我正在使用的 jars(全部添加到类路径中):

antlr-2.7.7.jar byte-buddy-1.8.0.jar 同学-1.3.0.jar dom4j-1.6.1.jar hibernate-commons-annotations-5.0.3.Final.jar hibernate-core-5.3.0.Final.jar hibernate-jpa-2.0-api-1.0.0.Final.jar jandex-2.0.3.Final.jar javassist-3.22.0-GA.jar javax.persistence-api-2.2.jar jboss-logging-3.3.2.Final.jar jboss-transaction-api_1.2_spec-1.0.1.Final.jar mysql-connector-java-8.0.11.jar

我在标题中提到的错误提到了我的代码中的一行,这是第一个代码片段中发生 .buildSessionFactory() 的一行。

【问题讨论】:

NoSuchMethodError in javax.persistence.Table.indexes()[Ljavax/persistence/Index的可能重复 hibernate-jpa-2.0-api-1.0.0.Final.jar 添加到类路径中。问题中给出的可能重复的答案无助于解决此问题。 问题是在你的类路径中是否没有低版本的 jar 冲突。如果您使用的是 maven,请执行 mvn dependency:tree 并检查重复项。 不使用 Maven。上面列出了所有使用的库。否则如何找到冲突的 jar 版本? 【参考方案1】:

您的类路径中有冲突的 jar:

hibernate-jpa-2.0-api-1.0.0.Final.jar

javax.persistence-api-2.2.jar

javax.persistence.Table.indexes 是 JPA 2.1 中添加的功能。

因此您应该丢弃 hibernate-jpa-2.0-api-1.0.0.Final.jar jar,因为它只描述 JPA 2.0 API。

当您有多个版本的相同类可供应用程序使用时,很难预测哪个版本会先加载,这就是为什么它有时会起作用的原因。但这基本上是一个彩票,所以你不应该在实践中这样做。

【讨论】:

【参考方案2】:

我有这个错误是因为我们使用了树脂服务器并升级了休眠

树脂有 JPA 2.0

并且 Web 应用程序具有 hibernate-jpa-2.1-api-1.0.2.Final.jar

这就是Steve C的回答中所述的冲突罐子的原因

要解决这种情况,您需要按照https://www.caucho.com/resin-4.0/admin/database.xtp#Hibernate 中的说明进行操作

在resin config文件中将新的api lib添加到resin classpath中

<server-default>
    <jvm-classpath>path/to/lib/hibernate-jpa-2.1-api-1.0.2.Final.jar</jvm-classpath>
    ...
<server-default>

【讨论】:

以上是关于休眠 5 - java.lang.NoSuchMethodError: javax.persistence.Table.indexes()的主要内容,如果未能解决你的问题,请参考以下文章

不要轻易在java ext 目录放任何三方jar包

Spark 和 Hbase-client 中的版本兼容性

JBoss EAP 6.4 -> 7.1 使用休眠 4 而不是默认休眠 5

带有 Spring JTA 的休眠 5

休眠 5 的 joda 时间兼容性问题

MySQL休眠异常