每个函数的EntityManagerFactory?

时间:2016-07-06 19:36:45

标签: java hibernate jpa

我应该在每个函数中创建和关闭EntityManagerFactory吗? 或者我应该在应用程序启动时创建它并在应用程序关闭时关闭它?我怎样才能做到这一点?

例如:

我有两个功能:

从数据库获取对象的函数:

private List<SomeItems> getItems() {

    List<SomeItems> resultList = new ArrayList<SomeItems>();

    entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
    entityManager = entityManagerFactory.createEntityManager();

    entityManager.getTransaction().begin();

    TypedQuery<SomeItems> query = entityManager.createQuery(
            "select n from SomeItems n", SomeItems.class);

    resultList = query.getResultList();

    entityManager.getTransaction().commit();
    entityManager.close();
    entityManagerFactory.close();

    return resultList;
}

仅获取项目名称的函数:

private List<String> getItemsName() {
List<String> resultList = new ArrayList<String>();

entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
entityManager = entityManagerFactory.createEntityManager();

entityManager.getTransaction().begin();

TypedQuery<String> query = entityManager.createQuery(
        "select n.name from SomeItems n", String.class);

resultList = query.getResultList();

entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();

return resultList;
}

我应该如何改进?

1 个答案:

答案 0 :(得分:2)

每次创建EntityManagerFactory都不行。这非常贵。按需创建一次。可以多次创建EntityManager。但工厂完全没有。您可以使用具有惰性或急切初始化类型的单例。你的来电。或者只是一个静态初始化块。很多选择。关键点不是在每次调用重用时创建工厂。好的这里是一个示例实现可能不是最好的,但它的工作原理。

 class EntityManagerFactoryHolder {
private static EnityManager entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");

public EntityManagerFactory getEntityManager(){
    return entityManagerFactory;
} 
}

这是具有EAGER初始化的单例。如果你想让LAZY在互联网上查找。