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>