2011-10-22 2 views

답변

57

그들은 중량이 너무 커서 응용 프로그램 범위에 있어야합니다. 따라서 응용 프로그램을 시작할 때 열어 응용 프로그램을 종료 할 때 닫아야합니다.

수행 방법은 대상 컨테이너에 따라 다릅니다. EJB 3.x (Glassfish, JBoss AS 등)를 지원합니까?

@Stateless 
public class FooService { 

    @PersistenceContext 
    private EntityManager em; 

    public Foo find(Long id) { 
     return em.find(Foo.class, id); 
    } 

    // ... 
} 

대상 컨테이너 아무튼 경우 : 그렇다면, 당신은 단지 @PersistenceContext으로 일반적인 방법을 EJB와의 JPA 작업을하는 모든 경우에 (도 거래에 대해)을 폐쇄/개방에 대해 걱정할 필요가 없습니다 OpenEJB과 같은 EJB (예 : Tomcat, Jetty 등) 및 EJB 애드온은 어떤 이유로 든 옵션이 아니므로 수동으로 EntityManager (및 트랜잭션)을 직접 생성하고 나서 가장 좋은 방법입니다 ServletContextListener입니다.

@WebListener 
public class EMF implements ServletContextListener { 

    private static EntityManagerFactory emf; 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     emf = Persistence.createEntityManagerFactory("unitname"); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     emf.close(); 
    } 

    public static EntityManager createEntityManager() { 
     if (emf == null) { 
      throw new IllegalStateException("Context is not initialized yet."); 
     } 

     return emf.createEntityManager(); 
    } 

} 

:

(참고 : 서블릿 3.0 전에,이 클래스가 web.xml 대신 @WebListener의에 <listener> 등록 할 필요가있다)로 사용할 수 있습니다 : 여기 기본 킥오프 예입니다

EntityManager em = EMF.createEntityManager(); 
// ... 
+0

"unitName"속성이없는 @PersistenceContext를 사용할 때 항상 우수하지만 예를 들어 추가하기를 원한다면 (i n 선언적이지 않은 방식으로) "persistence.xml"에 정의 된 유일한/default persistence-unit을 사용합니다. 여러 개의 데이터 소스/지속성 단위가있는 경우 이것이 어떤 것인지 혼란스럽게 할 수 있습니다. –

+0

누락 된 것이 무엇인지 모르겠지만 답을 따르지 만 런타임 오류가 있습니까? > 원인 : org.springframework.beans.factory.NoSuchBeanDefinitionException : [javax.persistence.EntityManagerFactory] 유형의 고유 bean이 정의되지 않았습니다 : 예상 된 단일 bean이지만 발견 됨 0 : – huahsin68

+3

@ huahsin68 : 원래 질문에는 전혀 관련이 없습니다 나는 봄도하지 않는다. 그냥 "Ask Question"을 누르십시오. – BalusC