我看到的用于创建 EntityManager 的惯用语是这样的:
public class BaseDao {
private static final String PERSISTENCE_UNIT_NAME = "Employee";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
public EntityManager getEntityManager() {
return factory.createEntityManager();
}
}
那么就是这样使用的:
Employee emp = new Employee();
emp.setName("Joe M");
getEntityManager().persist(emp);
问题是为什么不这样做:
public class BaseDao{
private static final String PERSISTENCE_UNIT_NAME = "Employee";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
private EntityManager entityManager = null;
public void setEntityManger() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
this.entityManager = factory.createEntityManager();
}
public EntityManager getEntityManager() {
return this.entityManager;
}
}
换句话说,是否需要始终通过 factory.createEntityManager()
获取实体管理器?还是可以将其创建为实例(甚至静态)变量并像那样检索?
为了澄清,我说的是不使用 EJB 或 Spring 容器的环境。
谢谢。
最佳答案
有两种方法可以创建 EntityManager
实例。
一种方式是用于 SDK 应用程序,我在单元测试中经常使用这种方式。这就是您的示例中的内容:
EntityManagerFactory factory =
Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
在企业应用程序中,您可以让容器为您创建它们并在需要时注入(inject)它们。
EntityManager
只是 JDBC 连接的包装器。它的重量很轻,可以在没有性能损失的情况下创建和销毁。
请记住,EntityManager
不是线程安全的,因此如果您有一个实例,您可能需要同步对它的访问。见 transaction basics了解详情。
我会这样做(大致):
public class BaseDao{
private static final String PERSISTENCE_UNIT_NAME = "Employee";
private static EntityManagerFactory factory =
Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
public void create(MyEntiy person){
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
// do what ever you need
em.getTransaction().commit();
em.close();
}
// add more methods to the dao.
}
一旦你得到这个原型(prototype)并准备好,你就可以使用一个通用的 DAO。
关于java - 获取 EntityManager 的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11173974/