최대 절전 모드 SessionFactory 대 JPA EntityManagerFactory


251

나는 Hibernate를 처음 사용하고 Hibernate 를 생성하기 위해 Hibernate SessionFactory또는 JPA EntityManagerFactory를 사용할지 확실하지 않다 Session.

이 둘의 차이점은 무엇입니까? 각각을 사용하는 장단점은 무엇입니까?


6
중복 질문에 대한이 답변은 정말 좋습니다. stackoverflow.com/questions/23445830/…
상현

답변:


365

선호하는 EntityManagerFactoryEntityManager. 그것들은 JPA 표준에 의해 정의됩니다.

SessionFactorySession최대 절전 모드 별입니다. 는 EntityManager후드에서 최대 절전 모드 세션을 호출합니다. 에서 사용할 수없는 특정 기능이 필요한 경우 다음 EntityManager을 호출하여 세션을 얻을 수 있습니다.

Session session = entityManager.unwrap(Session.class);

2
@elpisu-실제로 권장 할 수 없습니다. 공식 문서 만 학습 자료로 사용하고 있으며 (최소 2 년 동안) 신뢰할 수있는 다른 자료는 없습니다. 그러나 문서는 충분합니다.
Bozho

7
@ Bozho 나는 그것이 늦다는 것을 알고 있지만 SessionFactory와 Session 사용의 단점은 무엇입니까? JPA를 선호하는 이유는 무엇입니까? 감사합니다
Mickael Marrache

12
@MickaelMarrache JPA의 사용은 Java Enterprise 표준이기 때문에 Hibernate API보다 선호됩니다. JPA를 사용하면 (최대 절전 기능을 사용하지 않고 자신을 제한하면) 응용 프로그램 이식성이 향상됩니다. 즉, 프레임 워크가 JPA 표준을 준수하는 한 응용 프로그램을 최소한으로 변경하여 다른 지속성 프레임 워크로 전환 할 수 있습니다. .
László van den Hoek

2
엔터프라이즈 표준이기 때문에 더 낫습니까? 의심 스럽다. 표준은 일반적으로 발전 속도가 느리고 복잡합니다. 실제 혜택은 어떻습니까? JPA는 TypedQuery를 가지고 있기 때문에 더 좋습니다.
Bastian Voigt

1
이 접근 방식은 Session에서 EntityManager와 동일 SessionFactory.getCurrentSession()합니까? 내 말은, Session아직 만들어지지 않았다면 새로 열리 겠는가? 다중 스레드 환경에서 어떻게 작동합니까?
Sarvesh

32

여기 getDelegate()에서 메소드를 호출하여 Hibernate의 세션을 얻을 수 있음을 추가하고 싶습니다 EntityManager.

전의:

Session session = (Session) entityManager.getDelegate();

28
참고 unwrap()된다 바람직 할 위에 getDelegate(): 자바 문서에 따른 JavaEE 어플 6JavaEE 어플 7 .
ryenus

22

더 현대적인 느낌이 들기 때문에 JPA2 EntityManagerAPI보다 선호합니다 SessionFactory. 간단한 예 :

JPA :

@PersistenceContext
EntityManager entityManager;

public List<MyEntity> findSomeApples() {
  return entityManager
     .createQuery("from MyEntity where apples=7", MyEntity.class)
     .getResultList();
}

SessionFactory :

@Autowired
SessionFactory sessionFactory;

public List<MyEntity> findSomeApples() {
  Session session = sessionFactory.getCurrentSession();
  List<?> result = session.createQuery("from MyEntity where apples=7")
      .list();
  @SuppressWarnings("unchecked")
  List<MyEntity> resultCasted = (List<MyEntity>) result;
  return resultCasted;
}

EntityManager를 쉽게 조롱 할 수 있기 때문에 첫 번째 것이 더 깨끗하고 테스트하기 쉽다는 것이 분명하다고 생각합니다.


30
원하는 경우 코드를 복잡하게 만들 수 있습니다. return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
wst

entityManager를 직접 가져 왔으며 sessionfactory를 사용하여 세션을 가져와야한다는 것을 보여줍니다. : : D
JavaLearner

21

EntityManagerFactory 접근 방식을 사용하면 추가 구성없이 @PrePersist, @ PostPersist, @ PreUpdate와 같은 콜백 메소드 주석을 사용할 수 있습니다.

SessionFactory를 사용하는 동안 유사한 콜백을 사용하려면 추가 노력이 필요합니다.

관련 최대 절전 모드 문서는 여기여기 에서 찾을 수 있습니다 .

관련 SOF 질문봄 포럼 토론


21

SessionFactory vs. EntityManagerFactory

나는 설명으로 최대 절전 모드 사용 설명서 , 최대 절전 모드는 SessionFactoryJPA에 확장 EntityManagerFactory다음 다이어그램에 의해 도시 된 바와 같이 :

JPA와 최대 절전 관계

따라서 SessionFactory는 또한 JPA EntityManagerFactory입니다.

모두 SessionFactory와는 EntityManagerFactory엔티티 매핑 메타 데이터를 포함하고 하이버 네이트 만들 수 있습니다 Session또는를 EntityManager.

Session vs. EntityManager

그냥 같이 SessionFactory하고 EntityManagerFactory, 최대 절전 모드는 SessionJPA에 확장 EntityManager. 따라서에 의해 정의 된 모든 메소드 EntityManager는 Hibernate에서 사용 가능합니다 Session.

Session과`EntityManager를 번역 엔티티의 상태 전환을 SELECT, INSERT, UPDATE와 같은 SQL 문에, 및 삭제합니다.

최대 절전 모드와 JPA 부트 스트랩

JPA 또는 Hibernate 애플리케이션을 부트 스트랩 할 때 두 가지 선택 사항이 있습니다.

  1. 당신은 최대 절전 모드 기본 메커니즘을 통해 부트 스트랩,과를 만들 수 있습니다 SessionFactory비아 BootstrapServiceRegistryBuilder. Spring을 사용 LocalSessionFactoryBean하는 경우이 GitHub 예제에 설명 된 것처럼 최대 절전 모드 부트 스트랩은을 통해 수행됩니다 .
  2. 또는 클래스 또는을 EntityManagerFactory통해 JPA 를 만들 수 있습니다 . Spring을 사용 하는 경우이 GitHub 예제에서 설명하는 것처럼 JPA 부트 스트랩은을 통해 수행됩니다 .PersistenceEntityManagerFactoryBuilderLocalContainerEntityManagerFactoryBean

JPA를 통한 부트 스트랩이 선호됩니다. JPA FlushModeType.AUTO가 레거시보다 훨씬 나은 선택 이기 때문에 네이티브 SQL 쿼리에 대한 읽기-쓰기 일관성FlushMode.AUTO깨지기 때문 입니다.

최대 절전 모드로 JPA 풀기

또한 JPA를 통해 부트 스트랩하고 EntityManagerFactoryvia @PersistenceUnit주석을 삽입 한 경우 :

@PersistenceUnit
private EntityManagerFactory entityManagerFactory;

Sessionfactory다음 unwrap방법을 사용하여 기본에 쉽게 액세스 할 수 있습니다 .

SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

JPA에서도 마찬가지 EntityManager입니다. 주석을 EntityManager통해 주입하는 경우 @PersistenceContext:

@PersistenceContext
private EntityManager entityManager;

Session다음 unwrap방법을 사용하여 기본에 쉽게 액세스 할 수 있습니다 .

Session session = entityManager.unwrap(Session.class);

결론

따라서 JPA를 통해 부트 스트랩하고 EntityManagerFactoryand를 사용하고 JPA에서 사용할 EntityManager수없는 일부 Hibernate 고유 메소드 (예 : 자연 식별자를 통해 엔티티 가져 오기)에 액세스하려는 경우 이들을 연관된 Hibernate 인터페이스로 랩핑 해제해야합니다 .


2

EntityManager를 사용하면 코드가 더 이상 최대 절전 모드와 밀접하게 연결되지 않습니다. 그러나 이것을 위해서는 사용법을 사용해야합니다.

javax.persistence.EntityManager

대신에

org.hibernate.ejb.HibernateEntityManager

마찬가지로 EntityManagerFactory의 경우 javax 인터페이스를 사용하십시오. 그렇게하면 코드가 느슨하게 연결됩니다. 최대 절전 모드보다 JPA 2 구현이 더 좋으면 전환이 쉬울 것입니다. 극단적 인 경우에는 HibernateEntityManager에 캐스트를 입력 할 수 있습니다.


2

EntityManagerFactory는 표준 구현이며 모든 구현에서 동일합니다. EclipseLink와 같은 다른 제공자에 대해 ORM을 마이그레이션하는 경우 트랜잭션 처리 방법이 변경되지 않습니다. 반대로 최대 절전 모드의 세션 팩토리를 사용하는 경우 최대 절전 모드 API에 연결되어 새 공급 업체로 마이그레이션 할 수 없습니다.


1

EntityManager 인터페이스는 최대 절전 모드에서 sessionFactory와 유사합니다. javax.persistance 패키지 하의 EntityManager, org.hibernate.Session / sessionFactory 패키지 하의 session 및 sessionFactory

엔티티 관리자는 JPA에 고유하며 session / sessionFactory는 최대 절전 모드에 해당합니다.


귀하의 답변은 정확하지만 본질적으로 이상윤이 그의 의견에서 언급 한 답변과 동일합니다.
RWC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.