2016-07-06 4 views
1

모든 함수에서 EntityManagerFactory를 만들고 닫아야합니까? 또는 응용 프로그램이 시작될 때 응용 프로그램을 닫고 닫을 때 만들어야합니까? 나는 그것을 어떻게 얻을 수 있습니까?모든 기능에 대한 EntityManagerFactory?

예를 들어

: 데이터베이스에서 개체를 가져

기능 :

나는 두 가지 기능이

private List<SomeItems> getItems() { 

    List<SomeItems> resultList = new ArrayList<SomeItems>(); 

    entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase"); 
    entityManager = entityManagerFactory.createEntityManager(); 

    entityManager.getTransaction().begin(); 

    TypedQuery<SomeItems> query = entityManager.createQuery(
      "select n from SomeItems n", SomeItems.class); 

    resultList = query.getResultList(); 

    entityManager.getTransaction().commit(); 
    entityManager.close(); 
    entityManagerFactory.close(); 

    return resultList; 
} 

기능만을 얻을 항목 이름 :

private List<String> getItemsName() { 
List<String> resultList = new ArrayList<String>(); 

entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase"); 
entityManager = entityManagerFactory.createEntityManager(); 

entityManager.getTransaction().begin(); 

TypedQuery<String> query = entityManager.createQuery(
     "select n.name from SomeItems n", String.class); 

resultList = query.getResultList(); 

entityManager.getTransaction().commit(); 
entityManager.close(); 
entityManagerFactory.close(); 

return resultList; 
} 

어떻게해야 나는 그것을 향상 시키는가?

+0

모든 JPA 공급자에 대해 모든 JPA 문서가 EMF가 값 비싸지 만 EM은 값이 싸다는 것을 언급하기를 기대합니다. 당신의 공급자의 문서가 그런 말을하지 않는다면 그들에게 문제를 제기 할 것을 제안하십시오 –

답변

2

매번 EntityManagerFactory를 만드는 것은 좋지 않습니다. 굉장히 비싸다. 필요할 때마다 한 번 만듭니다. EntityManager가 여러 번 생성되면 괜찮습니다. 그러나 공장은 완전히 아니오. lazy 또는 eager 유형의 초기화로 싱글 톤을 사용할 수 있습니다. 너의 전화. 또는 어딘가에 정적 이니셜 라이저 블록. 많은 옵션. 요점은 각 호출 재사용시 공장을 생성하지 않는다는 것입니다. 좋아, 여기에 하나의 예제 구현이 가장 좋지 않을 수도 있지만 작동합니다.

class EntityManagerFactoryHolder { 
private static EnityManager entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase"); 

public EntityManagerFactory getEntityManager(){ 
    return entityManagerFactory; 
} 
} 

이것은 EAGER 초기화가있는 싱글 톤입니다. LAZY가 인터넷에서 찾길 원한다면.

+0

몇 가지 코드 샘플을 줄 수 있습니까? 그리고 나중에 그것을 닫는 것은 어떨까요? 내가 어떻게 그걸 성취 할 수 있니? –

+0

잘 엔티티 관리자에 관해서는 try {} finally {entityManager.close()} –

+0

에있는 메소드를 래핑 할 수 있습니다. 아마도 내가 틀렸을 수도 있지만이 줄은 어떨까요? 'entityManagerFactory.close();'가 필요합니까? 또는 언제 이것을 넣어야합니까? –

관련 문제