Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA 2.1/Hibernate 4.3弃用警告_Java_Hibernate_Jpa_Jpa 2.1 - Fatal编程技术网

Java JPA 2.1/Hibernate 4.3弃用警告

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

我使用的是带有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: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>