gpt4 book ai didi

java - 使用 JPA 和 Hibernate 的 ORM : EntityManager is null

转载 作者:行者123 更新时间:2023-12-02 04:32:15 25 4
gpt4 key购买 nike

我正在尝试在 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;

持久性.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>

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

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

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

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

有什么方法可以做到这一点?

最佳答案

我认为您的 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)。

关于java - 使用 JPA 和 Hibernate 的 ORM : EntityManager is null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31313112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com