当我关闭实体经理时JPA

时间:2016-06-05 23:00:47

标签: java jpa entitymanager

何时关闭实体经理?

public TYPE getItem(Long id) {
        if (id != null) {
            try {
                em = EMFactory.createEntityManager();
                TYPE item=em.find(entityClass, id);
                return item;
            } catch (Exception e) {
                System.err.println(e.getMessage());
            } finally {
                if (em != null)
                    em.close();
            }
        }
        return null;
    }

@WebListener
public class EMFactory implements ServletContextListener {

    private static EntityManagerFactory emf;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        emf = Persistence.createEntityManagerFactory("ejb");
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        emf.close();
    }

    public static EntityManager createEntityManager() {
        if (emf == null) {
            emf = Persistence.createEntityManagerFactory("ejb");
          // throw new IllegalStateException("Context is not initialized yet.");
        }

        return emf.createEntityManager();
    }

}

在任何操作create / update / select / remove之后,我总是关闭实体管理器。但我想这不是效率。那应该如何实施?

2 个答案:

答案 0 :(得分:0)

如果您在应用启动/停止时使用long-lived-transactions,则在会话激活/钝化/创建时使用{{3}}。

答案 1 :(得分:0)

回答你的问题我认为最好的方法是使用我附加的图像: entitymanager

但您应该充分利用Java EE和EJB可以为您提供的所有优势,您可以拥有一个容器来管理您经历的所有麻烦。它根据客户会话的需要在后台处理entitymanagerfactory。 看一眼 http://docs.oracle.com/javaee/6/tutorial/doc/bnblr.html