Обнаружен устаревший javax.persistence.spi.PersistenceProvider
Когда вы используете Spring & Hibernate, вы когда-нибудь встречали предупреждение журнала, которое говорит
ПРЕДУПРЕЖДЕНИЕ o.hibernate.ejb.HibernatePersistence - HHH015016: обнаружен устаревший javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; используйте взамен [org.hibernate.jpa.HibernatePersistenceProvider].
Как справиться с этим? Спасибо за любой ответ.
8 ответов
Так должно быть
org.hibernate.jpa.HibernatePersistenceProvider
Посмотрите на это.
Устаревшее.
Вместо этого используйте HibernatePersistenceProvider
Если вы работаете с Spring Data JPA и Java Configuration, вы сможете решить эту проблему, добавив следующий код в вашу фабрику Entity Manager:
factory.setPersistenceProvider (новый HibernatePersistenceProvider());
@Bean
public EntityManagerFactory entityManagerFactory() throws SQLException {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
**factory.setPersistenceProvider(new HibernatePersistenceProvider());**
factory.setPackagesToScan("com.company.appname.persistence.domain");
factory.setDataSource(dataSource());
factory.setJpaProperties(hibernateProperties());
factory.afterPropertiesSet();
return factory.getObject();
}
Хороший пример конфигурации Hibernate с помощью Spring Data JPA вы найдете здесь: http://spring.io/guides/tutorials/data/3/
Для пользователей, которые не используют SPRING:
Мы можем заменить стандартную загрузочную версию javax.persistence на специфичную для Hibernate.
Старый:
EntityManagerFactory emf = Persistence.createEntityManagerFactory(
PERSISTENCE_UNIT, props );
Новое:
PersistenceProvider provider = new HibernatePersistenceProvider();
EntityManagerFactory emf = provider.createEntityManagerFactory(
PERSISTENCE_UNIT, props);
Устаревшие предупреждения теперь должны исчезнуть. Проблема все еще присутствовала в 4.3.1.Final. В 5.1.0.Final это должно быть исправлено.
Возникла эта проблема при работе с Entity Manager в JPA в контексте Spring с транзакцией type="RESOURCE_LOCAL" в файле persistence.xml.
Это не всегда ошибка. Я на самом деле настроил неправильный провайдер.
Я только что сменил провайдера в persistence.xml с
<provider>org.hibernate.ejb.HibernatePersistence</provider>
в
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
и работает нормально.
Обратите внимание, что пакет изменился с EJB на JPA
Вы получаете это сообщение, потому что класс org.hibernate.ejb.HibernatePersistence
устарела. Под моим persistence.xml
файл, который я обнаружил, класс провайдера org.hibernate.ejb.HibernatePersistence
и я изменил это на org.hibernate.jpa.HibernatePersistenceProvider
как упомянуто в предупреждающем сообщении stacktrace.
persistence.xml
<persistence-unit name="personPersistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>Person</class>
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db_name"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
....
</properties>
</persistence-unit>
После изменения вашего org.hibernate.ejb.HibernatePersistence
в org.hibernate.jpa.HibernatePersistenceProvider
в persistence.xml
Изменить также hibernate-entitymanager
версия зависимости, получите последнюю версию 5.2.10. Final, которая исправила ошибку. Вот:
http://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager/5.2.10.Final
это работает для меня
Я изменил ссылку на:
org.hibernate.jpa.HibernatePersistenceProvider
но это не сработало.
Затем я удалил все ссылки на Hibernate 4.x jar libs, скачал последнюю версию (5.2.7), затем добавил файлы jar и, наконец, он работает.
Если вы создаете отношение Has-A и забыли упомянуть @Embedded, будет выдана та же ошибка.
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named TEST
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)