Обнаружен устаревший 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)
Другие вопросы по тегам