![]() |
|
public class TestAxman extends HttpServlet {
protected void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
Context env =(Context)newInitialContext().lookup("java:comp/env");
EntityManager em = (EntityManager)env.lookup("persistence/jpaUnit");
Query query = em.createQuery("SELECT c from CustomerEO c");
List <CustomerEO> ls = query.getResultList();
}
}如果你不想用注释可以在web.xml中配置:
<persistence-context-ref>
<persistence-context-ref-name>persistence/jpaUnit</persistence-context-ref-name>
<persistence-unit-name>jpaUnit</persistence-unit-name>
</persistence-context-ref>
<persistence-context-ref>
<persistence-context-ref-name>persistence/jpaUnit</persistence-context-ref-name>
<persistence-unit-name>jpaUnit</persistence-unit-name>
</persistence-context-ref>然后可以同样通过
Context env =(Context)new InitialContext().lookup("java:comp/env");
EntityManager em = (EntityManager)env.lookup("persistence/jpaUnit"); 查找到EntityManager.
需要说明的是,JNDI查看本身是耗时的,特别是new InitialContext().所以应该在一个全局的位置创建一个env (相当于工场).然后在service方法中通过这个env来查找EntityManager就可以大量地提升性能,比如:
public class TestAxman extends HttpServlet {
Context env = null;
protected void init(ServletConfig config) throws ServletException {
env = (Context)newInitialContext().lookup("java:comp/env");
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
EntityManager em = (EntityManager)env.lookup("persistence/jpaUnit");
Query query = em.createQuery("SELECT c from CustomerEO c");
List <CustomerEO> ls = query.getResultList();
}
}
public class TestAxman extends HttpServlet {
Context env = null;
protected void init(ServletConfig config) throws ServletException {
env = (Context)newInitialContext().lookup("java:comp/env");
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
EntityManager em = (EntityManager)env.lookup("persistence/jpaUnit");
Query query = em.createQuery("SELECT c from CustomerEO c");
List <CustomerEO> ls = query.getResultList();
}
}
<PRE class=java name="code">如果你需要容器管理持久化,这种方案是最合适的方式.虽然EntityManager 每次要在service中lookup出来,但它是</PRE>
<PRE class=java name="code">方法内的local变量,不象注入成实例变量那样存在多线程安全隐患.</PRE>
如果你需要容器管理持久化,这种方案是最合适的方式.虽然EntityManager 每次要在service中lookup出来,但它是 如果你需要容器管理持久化,这种方案是最合适的方式.虽然EntityManager 每次要在service中lookup出来,但它是
方法内的local变量,不象注入成实例变量那样存在多线程安全隐患. 方法内的local变量,不象注入成实例变量那样存在多线程安全隐患.
二.应用管理持久化上下文:
应用管理持久化上下文,事实上就是EntityManager对象不是由容器负责产生和销毁.而是由应用程序来创建,当然是 由应用程序来销毁.要由应用程序来创建持久化上下文,就是要由EntityManagerFactory来进行createEntityManager. 本着谁生产谁负责的原则,当然要程序来负责销毁.所以应用管理的EntityManager一定要在finally语句中调用close() 方法.这样多少给我们使用它带来不便.但它也因为是应用程序创建,所以有着广泛的应用范围,无论是EJB容器,还是WEB 容器,或者是纯Java SE环境,都可以使用JPA功能.
要在WEB容器获取EntityManagerFactory,同样可以通过注入和手工创建.明白"容器管理"的意义应该知道,注入 是容器已经产生了的对象,所以EntityManagerFactory如果是容器注入的,同样不需要你手工销毁,而如果是手工 创建的,则需要手工销毁.简单说EntityManagerFactory对象本身也可以容器管理的:
public class TestServlet extends HttpServlet {
@PersistenceUnit(unitName = "jpaUnit")
private EntityManagerFactory emf;
public void service(……) throws xxxExceotion{
EntityManager em = emf. createEntityManager();
try{
//invoke em;