【问题标题】:ORM with JPA and Hibernate: EntityManager is null带有 JPA 和 Hibernate 的 ORM:EntityManager 为空
【发布时间】:2015-07-09 09:14:14
【问题描述】:

我正在尝试在 Java SE 应用程序中使用 Hibernate 开始使用 ORM。我读过现代方法是使用 JPA,然后使用 Hibernate 作为持久性提供程序。但是,我的 EntityManager 为空:

依赖:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.10.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.10.Final</version>
    </dependency>

实体:

annotated with annotations form javax.persistence

使用数据库:

public class PersistenceManager {

    private static EntityManagerFactory emFactory;

    private PersistenceManager() {
        emFactory = Persistence.createEntityManagerFactory("pers-unit"); // defined in a persistence.xml
    }

    public static EntityManager getEntityManager() {
        return emFactory.createEntityManager();
    }

    public static void close() {
        emFactory.close();
    }
}

然后:

    String sql = "SELECT m FROM table m WHERE m.id = :id";
    EntityManager em = PersistenceManager.getEntityManager();
    em.getTransaction().begin();
    Query q = em.createQuery(sql);
    q.setParameter("id", key);
    Content result = (Content) q.getSingleResult();
    em.getTransaction().commit();
    em.close();
    PersistenceManager.close();
    return result;

persistence.xml:

<persistence 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"

    version="2.1">

    <persistence-unit name="pers-unit"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <properties>

            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/dbdb" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />

            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />
        </properties>
    </persistence-unit>
</persistence>

这是现在的方法吗?我看到的大多数教程都使用 SessionFactory 和 hibernate 中的事务。

我看了 2014 年的一本书,它使用了这个:

Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistryBuilder srBuilder = new ServiceRegistryBuilder();
srBuilder.applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry = srBuilder.buildServiceRegistry();
factory = configuration.buildSessionFactory(serviceRegistry);

其中已经有一些已弃用的代码。

这样做的方法是什么?

【问题讨论】:

    标签: java hibernate jpa orm


    【解决方案1】:

    我认为您的 PersistenceManager 类中有一些错误。 EntityManagerFactory 成员是静态的,获取 EntityManager 的方法也是静态的,但是当您以静态方式调用该方法时,您没有 PersistenceManager 的实例。这意味着根本不调用构造函数,因此您将无法在 null 引用上调用 createEntityManager()。

    你可以试试这个:

    public class PersistenceManager {
    
        private static EntityManagerFactory emFactory;
    
        static {
            emFactory = Persistence.createEntityManagerFactory("pers-unit"); // defined in a persistence.xml
        }
    
        public static EntityManager getEntityManager() {
           return emFactory.createEntityManager();
        }
    
        public static void close() {
            emFactory.close();
        }
    }
    

    关于你的问题,如果这是要走的路……没有确定的答案,因为这取决于个人选择。使用 SessionFactory 之类的教程指的是 Hibernate,而那些命名 EntityManagerFactory 和 EntityManager 的教程指的是 JPA 规范(Hibernate 实现了它,但它也有它的非 JPA API)。

    【讨论】:

    • 是的,就是这样。没有想到静态访问的后果。谢谢
    猜你喜欢
    • 2011-03-14
    • 2012-08-31
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 2021-02-23
    • 2023-01-11
    相关资源
    最近更新 更多