JPA 2.1 / Hibernate 4.3弃用警告

我正在使用JPA 2.1示例应用程序与Hibernate 4.3.x实现。

    org.hibernate.jpa.HibernatePersistenceProvider net.roseindia.model.Product            

pom.xml我有以下依赖项。

  org.hibernate hibernate-entitymanager 4.3.5.Final  

示例命令行应用程序正常工作(非常简单)但是在启动它时会收到以下警告消息。

 Apr 13, 2014 1:12:43 PM org.hibernate.ejb.HibernatePersistence logDeprecation WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead. 

那么,问题是我的错误配置(我可以避免它吗?),或者它是Hibernate实现中的问题?

更新

这是我使用的代码:

 import net.roseindia.model.Product; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class AppTest { private static final String PERSISTENCE_UNIT_NAME = "unit1"; private static EntityManagerFactory factory; public class AppTest { private static final String PERSISTENCE_UNIT_NAME = "unit1"; private static EntityManagerFactory factory; public static void main(String[] args) { factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Product product = new Product(); product.setProductName("JPA 2.1 Book"); product.setProductDescription("This is the latest book on JPA 2.1"); product.setStockQty(100.00); product.setPrice(95.99); em.persist(product); em.getTransaction().commit(); em.close(); factory.close(); } } 

对于有这个问题的Spring人来说,这就是正在发生的事情:即使Spring人员用类HibernateJpaVendorAdapter解决了这个问题,你实际上需要告诉你的JPA EntityManagerFactory使用这个类。 我已经使用以下配置删除了警告(注意我已经为jpaVendorAdapter指定了一个bean):

          

我调试了你的代码,似乎不推荐使用的类是由Persistence类自动加载的。 这是createEntityManagerFactory的实际代码,当您通过仅传递持久性单元名称调用它时调用它:

 public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) { EntityManagerFactory emf = null; List providers = getProviders(); for ( PersistenceProvider provider : providers ) { emf = provider.createEntityManagerFactory( persistenceUnitName, properties ); if ( emf != null ) { break; } } if ( emf == null ) { throw new PersistenceException( "No Persistence provider for EntityManager named " + persistenceUnitName ); } return emf; } 

getProviders()方法默认包含org.hibernate.ejb.HibernatePersistence作为第一个可能的提供者(作为我猜的后备解决方案)。 我会做的是这样的事情:

 import java.util.List; import java.util.Map; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.PersistenceException; import javax.persistence.spi.PersistenceProvider; import javax.persistence.spi.PersistenceProviderResolverHolder; import org.hibernate.ejb.HibernatePersistence; @SuppressWarnings({"deprecation", "rawtypes"}) public class CustomPersistence extends Persistence { public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName) { return CustomPersistence.createEntityManagerFactory(persistenceUnitName, null); } public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) { EntityManagerFactory emf = null; List providers = getProviders(); PersistenceProvider defaultProvider = null; for (PersistenceProvider provider : providers) { if (provider instanceof HibernatePersistence) { defaultProvider = provider; continue; } emf = provider.createEntityManagerFactory(persistenceUnitName, properties); if (emf != null) { break; } } if (emf == null && defaultProvider != null) emf = defaultProvider.createEntityManagerFactory( persistenceUnitName, properties ); if ( emf == null ) { throw new PersistenceException( "No Persistence provider for EntityManager named " + persistenceUnitName ); } return emf; } protected static List getProviders() { return PersistenceProviderResolverHolder .getPersistenceProviderResolver() .getPersistenceProviders(); } } 

我已经测试了该代码,它似乎足以解决问题。 在您的代码中,您只需要通过此CustomPersistence替换Persistence类。 我希望这有帮助。

这个问题似乎已经被提交为hibernate中的一个错误,并且已经针对5.0.0.Beta1修复了,请参阅https://hibernate.atlassian.net/browse/HHH-9141

至少我有同样的问题,并将依赖项更改为此版本使我的警告消失:

  org.hibernate hibernate-entitymanager 5.0.0.Beta1  

通过遵循弃用警告中的建议,我发现可以通过相对整洁的Spring bean创建Entity Manager Factory来解决这个问题。

从这里开始:

 WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead. 

我们可以看到从HibernatePersistenceProvider javadocs获取与javax.persistence.EntityManagerFactory兼容的类的路径。 首先,您需要一个HibernatePersistenceProvider实例,然后调用createEntityManagerFactory方法。 这是Spring Bean连接,它避免了弃用警告:

       

这里有一个Stackoverflow线程显示maven依赖项。