servlet中的持久性

时间:2012-05-31 08:20:04

标签: java-ee jpa persistence entitymanager servlet-3.0

我们不能在Servlet中使用EntityManager吗?像这样:

@WebServlet(name = "ServletPrincipal", urlPatterns = { "/test" })
public class ServletPrincipal extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


EntityManagerFactory emf = Persistence.createEntityManagerFactory("todo");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
for (int i = 0; i < 10; i++) {
Voiture car = new Voiture(0, "b", "c");
em.persist(car);
}

em.getTransaction().commit();

Query q1 = em.createQuery("SELECT COUNT(v) FROM Voiture v");
System.out.println("Le nombre d'enregistrement: "
+ q1.getSingleResult());

TypedQuery<Voiture> query = em.createQuery("SELECT v FROM Voiture v",
Voiture.class);
List<Voiture> results = query.getResultList();
for (Voiture p : results) {
System.out.println(p.getMatricule());

}
// Close the database connection:
em.close();
emf.close();

    }

}

如果你不能,那么如何在一个servlet中使用持久性呢?

为什么?

我使用tomcate7,servlet3,jpa2和java EE 6 非常感谢你

3 个答案:

答案 0 :(得分:0)

在Servlet中使用EntityManager是完全可以的。

因为你的servlet可以(并且可能会)同时提供多个请求,并且因为EntityManager不是线程安全的,所以你不应该将(而且不是注入)entityManager的实例分配给servlet中的字段。

您可以和probaly应该做的是仅创建一次EntityManagerFactory实例并重用它。 EntityManagerFactory是一个昂贵的对象来创建和使用它同时请求很好,因为它是线程安全的。

如果这个servlet只是你需要这个持久性单元的地方,你可以在servlet的init-method中打开EntityManagerFactory并在destroy-method中关闭它。

答案 1 :(得分:0)

通常,将持久性代码保留在控制器servlet中并不是一个好主意。但要回答你的问题,正如 @Mikko Maunu 正确地说,你可以在你的servlet中使用实体管理器。

答案 2 :(得分:0)

同样使用@PersistenceContext和@PersistenceUnit传递对EntityManager的引用和EntityManagerFactory是一个好主意。还要考虑EMFactory是线程安全的而EM不是。