Jakarta ee servlet中的持久性

Jakarta ee servlet中的持久性,jakarta-ee,jpa,persistence,entitymanager,servlet-3.0,Jakarta 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) thr

我们不能在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();

    }

}
@WebServlet(name=“ServletPrincipal”,urlPatterns={”/test})
公共类ServletPrincipal扩展了HttpServlet{
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
EntityManagerFactory emf=Persistence.createEntityManagerFactory(“todo”);
EntityManager em=emf.createEntityManager();
em.getTransaction().begin();
对于(int i=0;i<10;i++){
Voiture car=新Voiture(0,“b”,“c”);
em.persist(car);
}
em.getTransaction().commit();
查询q1=em.createQuery(“从Voiture v中选择计数(v”);
System.out.println(“注册名称:”
+q1.getSingleResult());
TypedQuery query=em.createQuery(“从Voiture v中选择v”,
职业类);
List results=query.getResultList();
对于(请注意:结果){
System.out.println(p.getMatricule());
}
//关闭数据库连接:
em.close();
emf.close();
}
}
如果不能,那么如何在一个servlet中使用持久性呢

为什么

我使用tomcate7、servlet3、jpa2和JavaEE6
非常感谢

在Servlet中使用EntityManager非常好

因为您的servlet可以(而且很可能会)同时服务多个请求,而且EntityManager不是线程安全的,所以您不应该将EntityManager的实例分配(也不应该注入)到servlet中的字段

您可以而且可能应该做的是只创建一次EntityManagerFactory实例并重用它。EntityManagerFactory是一个成本很高的对象,创建它并将其用于同步请求很好,因为它是线程安全的


如果此servlet是您需要此持久性单元的唯一位置,例如,您可以在servlet的init方法中打开EntityManagerFactory,并在destroy方法中关闭它。

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

还可以使用@PersistenceContext和@PersistenceUnit将引用传递给EntityManager和EntityManager工厂。还认为EMFactory是线程安全的,EM不是。

这里你可以得到一些光:什么让你认为你不能?