[java] 최대 절전 모드 SessionFactory 대 JPA EntityManagerFactory

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

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



답변

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

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

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


답변

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

전의:

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


답변

더 현대적인 느낌이 들기 때문에 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를 쉽게 조롱 할 수 있기 때문에 첫 번째 것이 더 깨끗하고 테스트하기 쉽다는 것이 분명하다고 생각합니다.


답변

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

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

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

관련 SOF 질문봄 포럼 토론


답변

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 인터페이스로 랩핑 해제해야합니다 .


답변

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

javax.persistence.EntityManager

대신에

org.hibernate.ejb.HibernateEntityManager

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


답변

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