Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个功能的EntityManagerFactory?_Java_Hibernate_Jpa - Fatal编程技术网

Java 每个功能的EntityManagerFactory?

Java 每个功能的EntityManagerFactory?,java,hibernate,jpa,Java,Hibernate,Jpa,我是否应该在每个函数中创建并关闭EntityManagerFactory? 或者我应该在应用程序启动时创建它,在应用程序关闭时关闭它?我怎样才能做到这一点 例如: 我有两个职能: 从数据库获取对象的函数: private List<SomeItems> getItems() { List<SomeItems> resultList = new ArrayList<SomeItems>(); entityManagerFactory = Pe

我是否应该在每个函数中创建并关闭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 getItems(){
List resultList=new ArrayList();
entityManagerFactory=Persistence.createEntityManagerFactory(“myDatabase”);
entityManager=entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
TypedQuery查询=entityManager.createQuery(
“从SomeItems n中选择n”,SomeItems.class);
resultList=query.getResultList();
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
返回结果列表;
}
仅获取项目名称的函数:

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;
}
private List getItemsName(){
List resultList=new ArrayList();
entityManagerFactory=Persistence.createEntityManagerFactory(“myDatabase”);
entityManager=entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
TypedQuery查询=entityManager.createQuery(
“从某些项中选择n.name”,String.class);
resultList=query.getResultList();
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
返回结果列表;
}

我应该如何改进呢?

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

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

public EntityManagerFactory getEntityManager(){
    return entityManagerFactory;
} 
}

这是具有急切初始化的单例。如果你想在网上查一查。

你能给出一些代码示例吗?那以后再关它怎么样?我怎样才能做到这一点呢?关于实体管理器,你可以用try{}finally{entityManager.close()}来包装这个方法。也许我错了,但是这一行呢<代码>entityManagerFactory.close()是否需要它?或者我应该什么时候把它放进去?在一般情况下,当你的应用程序全天候运行时,你不必关闭它。如果你长时间不活动,那么你可以关闭它。为什么这个答案不再被接受?有什么变化吗?我希望每个JPA提供商的所有JPA文档都提到,创建EMF很昂贵,而EM很便宜。如果您的提供商的文档没有这样说,那么建议您向他们提出问题