2014-02-11 16 views
26

當您使用的彈簧&休眠,你有沒有遇到一個日誌警告說遇到一個過時javax.persistence.spi.PersistenceProvider

WARN o.hibernate.ejb.HibernatePersistence - HHH015016:遇到一個 棄用javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence];改爲使用 [org.hibernate.jpa.HibernatePersistenceProvider]。

如何處理?謝謝你的回答。

+5

使用[org.hibernate.jpa.HibernatePersistenceProvider],而不是工作? – 2014-02-19 22:02:25

+1

這是一個Hibernate的bug。據說固定在較新的版本:https://hibernate.atlassian.net/browse/HHH-8625 – Steve

+0

不固定在最新的穩定。 –

回答

27

應該

org.hibernate.jpa.HibernatePersistenceProvider 

看一看this

已棄用。

使用HibernatePersistenceProvider代替

+8

問題的原因?如何解決這個問題?我應該在彈簧配置中更改哪些文件? – riship89

+1

@ riship89你必須改變'persistence.xml'。 @AaronHall這是錯的。我寫了使用'org.hibernate.jpa.HibernatePersistenceProvider'而不是'javax.persistence.spi.PersistenceProvider'。 – hofmeister

+0

你的異常信息更可讀... – dit

14

如果您正在使用Spring數據JPA和Java的配置工作,你就可以解決這個問題,將在您的實體管理器工廠下面的代碼:

廠.setPersistenceProvider(new 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數據JPA這裏一個很好的例子:http://spring.io/guides/tutorials/data/3/

7

與JPA的實體管理器在Spring上下文中工作時,其交易型=「RESOURCE_LOCAL」有這個問題persistence.xml中。

這並不總是一個錯誤。我實際上配置了錯誤的提供程序。

我只是改變了供應商在persistence.xml中從

<provider>org.hibernate.ejb.HibernatePersistence</provider> 

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 

,它工作正常。

注意,從EJB改爲JPA

+7

它不適用於我.... –

+1

對我也不適用 – okwap

+1

對我也不適用 – DesirePRG

2

包,因爲該類org.hibernate.ejb.HibernatePersistence不贊成你得到這個消息。在我的persistence.xml文件下,我發現提供者類具有org.hibernate.ejb.HibernatePersistence,並且我將其更改爲org.hibernate.jpa.HibernatePersistenceProvider,如stacktrace警告消息中所述。

持久性。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> 
+1

對於那些在xml中彈出配置請參閱:http://stackoverflow.com/questions/24520602/spring-data-jpa-no-bean-named-entitymanagerfactory-is-defined-injection-of-a。聲明是

5

對於誰是不使用Spring用戶:

我們可以通過一個Hibernate特定的一個替代標準javax.persistence引導。

老:

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它應該是固定的。

+0

:(太糟糕了。不能去5。1,它打破了我所有的命名策略,並且沒有資金花費數小時來搞亂命名策略...... – Gus

0

我改變了參考:

org.hibernate.jpa.HibernatePersistenceProvider 

,但沒有奏效。

然後,我刪除了所有對Hibernate 4.x jar庫的引用,下載了最新版本(5.2.7),然後添加了這個jar文件並且它終於可用。