gpt4 book ai didi

java - 如何在 jpa 中共享 EntityManagerFactory

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:29 25 4
gpt4 key购买 nike

我是 jpa 的新手这是场景......我正在开发一个网络应用......在哪里

多个用户可以登录...

当 user1 注销时...我正在使用以下代码...

public static void closeEntityManagerFactory() {

if (!entityManager.getTransaction().isActive()){

entityManager.getTransaction().begin();

}

entityManager.close();

emf.close();

}

即使 user2 已登录,它也会抛出错误,告知 Entity Manager 已关闭....

问题是我们不应该在应用程序启动后关闭 EntityManager...???或者我们

应该使用多实例......如果是的话如何实现这个......帮助将是可观的:) :)

最佳答案

EntityManagerFactory 实例的创建成本很高,而 EntityManager 实例则不然。在 Java SE Web 应用程序中,大多数情况都可以只用一个 EntityManagerFactory 实例来处理。

您可以在 ServletContextListenercontextInitialized 方法中初始化 EntityManagerFactory|并将实例存储在上下文属性中 (context.setAttribute(key, emf)):

public class CustomServletContextListener implements ServletContextListener {

private EntityManagerFactory entityManagerFactory;

@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();

entityManagerFactory = Persistence.createEntityManagerFactory("UnitName");
context.setAttribute("someKey", entityManagerFactory);
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
/* Some method that cleanly destroys
* your entity manager factory */
closeEntityManagerFactory();
}
}

稍后,您可以使用 context.getAttribute("someKey") 检索 EntityManagerFactory 实例,并在需要时创建 EntityManager 实例。

最后,为了让您的 ServerContextListener 实现正常工作,只需在您的 web.xml 中注册它:

<listener>
<listener-class>com.company.listeners.CustomServletContextListener</listener-class>
</listener>

注意:您需要短期还是长期的 EntityManager 实例取决于您的应用程序的范围。在典型的 Web 应用程序中,跨越请求的短期应用程序更为明智。请参阅 Bauer 和 King, Manning 的Java Persistence with Hibernate,了解有关 EntityManager 实例的不同策略。该文本并行处理 Hibernate 和 JPA。

关于java - 如何在 jpa 中共享 EntityManagerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22628862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com