在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的值。 但在下面的代码中,我感到困惑。 哪一个最快?你认为哪一个是最好的?