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

Я пытаюсь протестировать некоторые POJO с аннотациями в спящем режиме и снова и снова получаю ту же ошибку. Я использовал ту же конфигурацию в другом проекте, и все работало нормально. Я протестировал соединение jdbc, которое используется при тестировании объектов Hib - и соединение работает нормально.

Я нашел несколько других вопросов о той же ошибке, но ничего не помогло.

Код в классе тестирования с методом 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;
    }

Ниже приведены методы получения и установки для каждой сущности.

Файл hibernate.cfg.xml имеет ту же конфигурацию, что и тот же файл в другом проекте, где соединение и код гибернации работают отлично - как писал ранее, соединение было проверено в отдельном классе.

Банки, которые я использую (все добавлены в путь к классам):

  • antlr-2.7.7.jar byte-buddy-1.8.0.jar
  • одноклассник-1.3.0.jar
  • dom4j-1.6.1.jar
  • спящая-Викисклад аннотации-5.0.3.Final.jar
  • Зимуют-ядро-5.3.0.Final.jar
  • спящий режим JPA-2,0-апи-1.0.0.Final.jar-
  • Jandex-2.0.3.Final.jar
  • Javassist-3.22.0-GA.jar
  • javax.persistence-апи-2.2.jar
  • JBoss-каротаж 3.3.2.Final.jar
  • JBoss-транзакций api_1.2_spec-1.0.1.Final.jar
  • MySQL-разъем-Java-8.0.11.jar

Ошибка, о которой я упоминал в заголовке, упоминает строку в моем коде, которая является строкой в ​​первом фрагменте кода, где происходит.buildSessionFactory().

2 ответа

У вас есть конфликтующие фляги в вашем пути к классу:

  • спящий режим JPA-2,0-апи-1.0.0.Final.jar-

  • javax.persistence-апи-2.2.jar

javax.persistence.Table.indexes - это функция, которая была добавлена ​​в JPA 2.1.

Поэтому вы должны отказаться от файла hibernate-jpa-2.0-api-1.0.0.Final.jar, поскольку он описывает только API JPA 2.0.

Когда у вас есть несколько версий одних и тех же классов, доступных для приложения, трудно предсказать, какая версия будет загружена первой, поэтому иногда она может работать. Но это в основном лотерея, поэтому вы никогда не должны делать это на практике.

У меня была эта ошибка, потому что мы использовали сервер смолы и обновили спящий режим

смола имеет JPA 2.0

а в веб-приложении есть hibernate-jpa-2.1-api-1.0.2.Final.jar

это то, что сделало конфликтующие банки, как указано в Steve Cответ

чтобы исправить этот случай, вам нужно сделать, как указано в https://www.caucho.com/resin-4.0/admin/database.xtp#Hibernate

в файле конфигурации смолы добавьте новый api lib в путь к классам смолы следующим образом

      <server-default>
    <jvm-classpath>path/to/lib/hibernate-jpa-2.1-api-1.0.2.Final.jar</jvm-classpath>
    ...
<server-default>
Другие вопросы по тегам