当前位置: 首页 > 面试题库 >

获取EntityManagerFactory的最佳实践

宿洋
2023-03-14
问题内容

在Web应用程序(jsp /servlets)中获取EntityManagerFactory的最佳方法是什么?这是一个好方法,何时应创建/打开EntityManagerFactory实例?,还是从JNDI或其他方式获得它更好?


问题答案:

它们是重量级的,应该在应用程序范围内。因此,您需要在应用程序启动时将其打开,并在应用程序关闭时将其关闭。

该如何做取决于您的目标容器。它是否支持EJB3.x(Glassfish,JBossAS等)?如果是这样,那么如果您只用@PersistenceContext通常的方式在EJB中执行JPA工作,那么您根本就不必担心打开/关闭它们(与事务无关):

@Stateless
public class FooService {

    @PersistenceContext
    private EntityManager em;

    public Foo find(Long id) {
        return em.find(Foo.class, id);
    }

    // ...
}

如果您的目标容器不支持EJB(例如Tomcat,Jetty等),并且由于某种原因也无法选择像OpenEJB这样的EJB附加组件,那么您就EntityManager自己动手创建了(和事务),那么你最好的选择是ServletContextListener。这是一个
基本的 启动示例:

@WebListener
public class EMF implements ServletContextListener {

    private static EntityManagerFactory emf;

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

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

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

        return emf.createEntityManager();
    }

}

(注意:在Servlet 3.0之前,该类需要由<listener>inweb.xml代替来注册@WebListener

可以用作:

EntityManager em = EMF.createEntityManager();
// ...


 类似资料:
  • 问题内容: 在进行学校项目时,我编写了以下代码: 问题在于Netbeans告诉我这些行抛出一个,因此必须被捕获或声明。它还抱怨并且可能尚未初始化(尽管检查为空)。 似乎整个问题都在此停了下来,这似乎有些奇怪。 我的下意识解决方法是这样做: 但是,这深深地困扰着我,让我感到肮脏。 我来自C#背景,我只是在这里利用块,因此我不确定处理此问题的“正确”方法是什么。 解决这个问题的正确方法 是 什么? 问

  • 问题内容: 我需要hibernate的一个特定功能,即StatelessSession,为此,我需要hibernate的SessionFactory。问题是我只有entityManagerFactory。在这种情况下如何获得StatelessSession? 问题答案: 我通过注入来解决它,定义了像这样的bean http://docs.spring.io/spring/docs/3.0.x/sp

  • 问题内容: 我想知道,JavaScript提供了多种方法来从任何元素中获取第一个子元素,但是哪种方法最好呢?最好的意思是:在行为方面,大多数跨浏览器兼容,最快,最全面且可预测。我用作别名的方法/属性的列表: 这适用于两种情况: 在表单或迭代的情况下。如果我可能遇到文字元素: 据我所知,使用来自的NodeList ,并使用。我将这一假设基于MDN参考: 是对元素节点的第一个子元素的引用,或者如果不存

  • 我想知道,JavaScript提供了多种方法从任何元素中获取第一个子元素,但哪种方法最好?我所说的“最佳”是指:在行为方面,最兼容跨浏览器、最快、最全面、最可预测。我用作别名的方法/属性列表: 这适用于两种情况: 这是表单的情况,或

  • 问题内容: 我现在正在上一门C#类,并且试图找出做事的最佳方法。我来自Java背景,因此只熟悉Java最佳实践。我是C#新手! 在Java中,如果我有私有财产,则可以这样做。 在C#中,我看到有很多方法可以做到这一点。 我可以像Java那样做: 或者我可以这样: 要么: 我应该使用哪一种?每种方法有哪些警告或细微之处?创建类时,我遵循的是我从Java中学到的最佳常规(特别是阅读Effective

  • 我对函数返回有点困惑,我的目的是尽量避免复制。 我读了一些文档,告诉我不要使用reference作为map的值。 但在下面的代码中,我感到困惑。 哪一个最快?你认为哪一个是最好的?