Java JPA 2.1/Hibernate 4.3弃用警告
我使用的是带有Hibernate4.3.x实现的Java JPA 2.1/Hibernate 4.3弃用警告,java,hibernate,jpa,jpa-2.1,Java,Hibernate,Jpa,Jpa 2.1,我使用的是带有Hibernate4.3.x实现的JPA2.1示例应用程序 <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schema
JPA2.1
示例应用程序
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="unit1">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>net.roseindia.model.Product</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/common"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
示例命令行应用程序工作正常(t非常简单),但在启动它时会收到以下警告消息
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用户使用类HibernateJavaEndorapter解决了这个问题,您实际上也需要告诉您的JPA EntityManager工厂使用这个类。我已通过以下配置删除了警告(注意,我已为jpaVendorAdapter指定了一个bean):
我已经调试了您的代码,似乎已弃用的类是由持久性类自动加载的。这是createEntityManagerFactory的实际代码,当您仅通过传递持久化单元名称来调用它时,就会调用该代码:
public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
EntityManagerFactory emf = null;
List<PersistenceProvider> 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;
}
公共静态EntityManagerFactory createEntityManagerFactory(字符串persistenceUnitName,映射属性){
EntityManagerFactory emf=null;
List providers=getProviders();
for(PersistenceProvider提供程序:提供程序){
emf=provider.createEntityManagerFactory(persistenceUnitName,properties);
if(emf!=null){
打破
}
}
if(emf==null){
抛出新的PersistenceException(“没有名为“+persistenceUnitName”的EntityManager的持久性提供程序);
}
返回电动势;
}
默认情况下,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<PersistenceProvider> 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<PersistenceProvider> getProviders() {
return PersistenceProviderResolverHolder
.getPersistenceProviderResolver()
.getPersistenceProviders();
}
}
import java.util.List;
导入java.util.Map;
导入javax.persistence.EntityManagerFactory;
导入javax.persistence.persistence;
导入javax.persistence.PersistenceException;
导入javax.persistence.spi.PersistenceProvider;
导入javax.persistence.spi.PersistenceProviderResolverHolder;
导入org.hibernate.ejb.HibernatePersistence;
@SuppressWarnings({“弃用”、“原始类型”})
公共类CustomPersistence扩展了持久性{
公共静态EntityManagerFactory createEntityManagerFactory(字符串persistenceUnitName){
返回CustomPersistence.createEntityManagerFactory(persistenceUnitName,null);
}
公共静态EntityManagerFactory createEntityManagerFactory(字符串persistenceUnitName,映射属性){
EntityManagerFactory emf=null;
List providers=getProviders();
PersistenceProviderDefaultProvider=null;
for(PersistenceProvider提供程序:提供程序){
if(HibernatePersistence的提供程序实例){
defaultProvider=提供者;
继续;
}
emf=provider.createEntityManagerFactory(persistenceUnitName,properties);
if(emf!=null){
打破
}
}
if(emf==null&&defaultProvider!=null)
emf=defaultProvider.createEntityManagerFactory(persistenceUnitName,properties);
if(emf==null){
抛出新的PersistenceException(“没有名为“+persistenceUnitName”的EntityManager的持久性提供程序);
}
返回电动势;
}
受保护的静态列表getProviders(){
返回PersistenceProviderResolverHolder
.getPersistenceProviderResolver()
.getPersistenceProviders();
}
}
我已经测试了该代码,它似乎足够好,可以解决这个问题。在代码中,您只需将持久性类替换为这个自定义持久性。我希望这会有所帮助。按照弃用警告中的建议,我发现通过创建相对整洁的实体管理器工厂Springbean,可以克服这个问题 从这里开始:
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
我们可以看到从中获得与javax.persistence.EntityManagerFactory兼容的类的路径。首先需要HibernatePersistenceProvider的实例,然后调用createEntityManagerFactory方法。以下是SpringBean连线,它避免了弃用警告:
<bean id="persistenceProvider" class="org.hibernate.jpa.HibernatePersistenceProvider">
</bean>
<bean id="emf" factory-bean="persistenceProvider" factory-method="createEntityManagerFactory">
<constructor-arg value="testpersistence"/>
<constructor-arg><map/></constructor-arg>
</bean>
有一个显示maven依赖关系的窗口。该问题似乎在hibernate中作为一个bug提交,并且在版本5.0.0.Beta1中已修复,请参阅 至少我遇到了同样的问题,将依赖项更改为此版本使我的警告消失:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.0.Beta1</version>
</dependency>
org.hibernate
休眠实体管理器
5.0.0.1
向我们展示您如何创建EntityManagerFactory。在某些地方,您使用的是旧的org.hibernate.ejb.HibernatePersistence,而不是新的org.hibernate.jpa.HibernatePersistenceProvider。只要对代码进行简单的搜索,就可以找到它。@JBNizet,我更新了正在运行的类。够了吗?听起来像只虫子。大概或者加载的persistence.xml实际上不是您展示给我们的。不,我提供的与我正在运行的完全相同。是的,我也发现了一些类似的问题(),但不是针对版本hibernate 4.3.x
,所以我想我做了一些不正确的事情。无论如何,非常感谢。你用的是弹簧吗?可能是Shaka,是的,通常我在spring中使用它,但在这种情况下,我只使用JPA并得到警告,我想确保警告原因不是我配置中的错误。不管怎样,谢谢。回答编辑。我已经画出了整个草图。我希望这真的能帮助您。请参见:(在5.0.0 beta1中修复)。
<bean id="persistenceProvider" class="org.hibernate.jpa.HibernatePersistenceProvider">
</bean>
<bean id="emf" factory-bean="persistenceProvider" factory-method="createEntityManagerFactory">
<constructor-arg value="testpersistence"/>
<constructor-arg><map/></constructor-arg>
</bean>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.0.Beta1</version>
</dependency>