2012-05-31 4 views
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(); 

    } 

} 

당신은 그럼 어떻게 하나의 서블릿에서 지속성을 사용할 수없는 경우?

왜?

은 내가 tomcate7, servlet3, jpa2, 6 당신에게

+0

여기에서 약간의 빛을 얻을 수 있습니다. http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html – perissf

+0

당신은 무엇을 할 수 없다고 생각합니까? –

답변

0

서블릿에서 EntityManager를 사용하는 것이 완벽하게 괜찮 대단히 감사합니다 자바 EE를 사용합니다.

서블릿은 동시에 여러 요청을 처리 할 수 ​​있기 때문에 (EntityManager는 스레드로부터 안전하지 않기 때문에) 서블릿의 필드에 entityManager 인스턴스를 할당하면 안됩니다.

그리고 할 수있는 일은 EntityManagerFactory 인스턴스를 한 번만 만들고 다시 사용하는 것입니다. EntityManagerFactory는 스레드로부터 안전하기 때문에 동시 요청을 위해 생성하고 사용하는 데 비용이 많이 드는 객체입니다.

이 지속성 단위가 필요한 곳에서만이 서블릿을 배치하면 Servlet의 init 메소드에서 EntityManagerFactory를 열고 destroy-method에서 닫을 수 있습니다.

0

일반적으로 컨트롤러 서블릿에 지속성 코드를 유지하는 것은 좋지 않습니다. 하지만 귀하의 질문에 대답하기 위해, @Mikko Maunu 올바르게 말하면 서블릿에서 엔티티 관리자를 사용할 수 있습니다.

0

또한 @PersistenceContext 및 @PersistenceUnit을 사용하여 EntityManager 및 EntityManagerFactory에 대한 참조를 전달하는 것이 좋습니다. 또한 EMFactory는 스레드로부터 안전하며 EM은 그렇지 않습니다.