나는 Hibernate를 처음 사용하고 Hibernate 를 생성하기 위해 Hibernate SessionFactory
또는 JPA EntityManagerFactory
를 사용할지 확실하지 않다 Session
.
이 둘의 차이점은 무엇입니까? 각각을 사용하는 장단점은 무엇입니까?
답변
선호하는 EntityManagerFactory
및 EntityManager
. 그것들은 JPA 표준에 의해 정의됩니다.
SessionFactory
및 Session
최대 절전 모드 별입니다. 는 EntityManager
후드에서 최대 절전 모드 세션을 호출합니다. 에서 사용할 수없는 특정 기능이 필요한 경우 다음 EntityManager
을 호출하여 세션을 얻을 수 있습니다.
Session session = entityManager.unwrap(Session.class);
답변
여기 getDelegate()
에서 메소드를 호출하여 Hibernate의 세션을 얻을 수 있음을 추가하고 싶습니다 EntityManager
.
전의:
Session session = (Session) entityManager.getDelegate();
답변
더 현대적인 느낌이 들기 때문에 JPA2 EntityManager
API보다 선호합니다 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를 사용하는 동안 유사한 콜백을 사용하려면 추가 노력이 필요합니다.
답변
SessionFactory
vs. EntityManagerFactory
나는 설명으로 최대 절전 모드 사용 설명서 , 최대 절전 모드는 SessionFactory
JPA에 확장 EntityManagerFactory
다음 다이어그램에 의해 도시 된 바와 같이 :
따라서 SessionFactory
는 또한 JPA EntityManagerFactory
입니다.
모두 SessionFactory
와는 EntityManagerFactory
엔티티 매핑 메타 데이터를 포함하고 하이버 네이트 만들 수 있습니다 Session
또는를 EntityManager
.
Session
vs. EntityManager
그냥 같이 SessionFactory
하고 EntityManagerFactory
, 최대 절전 모드는 Session
JPA에 확장 EntityManager
. 따라서에 의해 정의 된 모든 메소드 EntityManager
는 Hibernate에서 사용 가능합니다 Session
.
Session
과`EntityManager를 번역 엔티티의 상태 전환을 SELECT, INSERT, UPDATE와 같은 SQL 문에, 및 삭제합니다.
최대 절전 모드와 JPA 부트 스트랩
JPA 또는 Hibernate 애플리케이션을 부트 스트랩 할 때 두 가지 선택 사항이 있습니다.
- 당신은 최대 절전 모드 기본 메커니즘을 통해 부트 스트랩,과를 만들 수 있습니다
SessionFactory
비아BootstrapServiceRegistryBuilder
. Spring을 사용LocalSessionFactoryBean
하는 경우이 GitHub 예제에 설명 된 것처럼 최대 절전 모드 부트 스트랩은을 통해 수행됩니다 . - 또는 클래스 또는을
EntityManagerFactory
통해 JPA 를 만들 수 있습니다 . Spring을 사용 하는 경우이 GitHub 예제에서 설명하는 것처럼 JPA 부트 스트랩은을 통해 수행됩니다 .Persistence
EntityManagerFactoryBuilder
LocalContainerEntityManagerFactoryBean
JPA를 통한 부트 스트랩이 선호됩니다. JPA FlushModeType.AUTO
가 레거시보다 훨씬 나은 선택 이기 때문에 네이티브 SQL 쿼리에 대한 읽기-쓰기 일관성FlushMode.AUTO
이 깨지기 때문 입니다.
최대 절전 모드로 JPA 풀기
또한 JPA를 통해 부트 스트랩하고 EntityManagerFactory
via @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를 통해 부트 스트랩하고 EntityManagerFactory
and를 사용하고 JPA에서 사용할 EntityManager
수없는 일부 Hibernate 고유 메소드 (예 : 자연 식별자를 통해 엔티티 가져 오기)에 액세스하려는 경우 이들을 연관된 Hibernate 인터페이스로 랩핑 해제해야합니다 .
답변
EntityManager를 사용하면 코드가 더 이상 최대 절전 모드와 밀접하게 연결되지 않습니다. 그러나 이것을 위해서는 사용법을 사용해야합니다.
javax.persistence.EntityManager
대신에
org.hibernate.ejb.HibernateEntityManager
마찬가지로 EntityManagerFactory의 경우 javax 인터페이스를 사용하십시오. 그렇게하면 코드가 느슨하게 연결됩니다. 최대 절전 모드보다 JPA 2 구현이 더 좋으면 전환이 쉬울 것입니다. 극단적 인 경우에는 HibernateEntityManager에 캐스트를 입력 할 수 있습니다.
답변
EntityManagerFactory는 표준 구현이며 모든 구현에서 동일합니다. EclipseLink와 같은 다른 제공자에 대해 ORM을 마이그레이션하는 경우 트랜잭션 처리 방법이 변경되지 않습니다. 반대로 최대 절전 모드의 세션 팩토리를 사용하는 경우 최대 절전 모드 API에 연결되어 새 공급 업체로 마이그레이션 할 수 없습니다.