我们不能在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 非常感谢你
答案 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不是。