Java 带有JPA和Hibernate的ORM:EntityManager为空
我正在尝试在JavaSE应用程序中使用Hibernate开始使用ORM。我已经读到,现代的方法是使用JPA,然后使用Hibernate作为持久性提供者。但是,我的EntityManager为空: 依赖项:Java 带有JPA和Hibernate的ORM:EntityManager为空,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我正在尝试在JavaSE应用程序中使用Hibernate开始使用ORM。我已经读到,现代的方法是使用JPA,然后使用Hibernate作为持久性提供者。但是,我的EntityManager为空: 依赖项: <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <
<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>
要使用数据库,请执行以下操作:
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>
已经有一些不推荐使用的代码
怎么做 我认为您的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)。Yepp,就是这样。没有想到静态访问的后果。谢谢
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistryBuilder srBuilder = new ServiceRegistryBuilder();
srBuilder.applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry = srBuilder.buildServiceRegistry();
factory = configuration.buildSessionFactory(serviceRegistry);
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();
}
}