java - 获取 EntityManager 的不同方法

标签 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();
    } 
}

那么就是这样使用的:

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/

相关文章:

java - PreUpdate 回调中未修改字段值

java - SurfacePlotMesh (FXyz) 构造函数参数

java - java.lang.ClassNotFoundException:org.apache.hadoop.hbase.mapreduce.TableOutputFormat

java - 如何使用 java.time.LocalDateTime 设置 jadira PersistentLocalDateTime?

java - 我用 Hibernate/JPA 得到一个 "error, string or binary data would be truncated"

java - 如何在 hibernate postPersist 监听器中持久化实体

java - 为什么java没有非字节码编译器?

JavaFX 8 : Unstable interactive TabPane when adding new Tab

java - 存储在Web应用程序Java中的静态实例变量中

java - 仅更新更改的实体字段并检查 EJB 中其他用户的更改