获取EntityManager的不同方法

jay*_*jay 31 java jpa entitymanager

我在创建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();
    } 
}
Run Code Online (Sandbox Code Playgroud)

然后就像这样使用:

Employee emp = new Employee();
emp.setName("Joe M");
getEntityManager().persist(emp);
Run Code Online (Sandbox Code Playgroud)

问题是为什么不这样做:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,是否需要始终通过factory.createEntityManager()获取实体管理器?或者它可以创建为实例(甚至静态)变量并像这样检索?

为了澄清,我在谈论一个不使用EJB或Spring容器的环境.

谢谢.

Man*_*our 16

有两种方法可以创建EntityManager实例.一种方法是SDK应用程序,我在单元测试中使用这种方式很多.这就是你的例子:

EntityManagerFactory factory = 
  Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
Run Code Online (Sandbox Code Playgroud)

在Enterprise应用程序中,您让容器为您创建它们并在需要时注入它们.

EntityManager只是JDBC连接的包装器.它的重量非常轻,可以创建和销毁而不会降低性能.

请记住,这EntityManager不是线程安全的,因此如果您有一个实例,则可能需要同步对它的访问.有关详细信息,请参阅事务基础


这是我将如何做到(大致):

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.
}
Run Code Online (Sandbox Code Playgroud)

一旦你得到这个原型并准备就绪,你就可以使用通用的DAO.