답변:
선호하는 EntityManagerFactory
및 EntityManager
. 그것들은 JPA 표준에 의해 정의됩니다.
SessionFactory
및 Session
최대 절전 모드 별입니다. 는 EntityManager
후드에서 최대 절전 모드 세션을 호출합니다. 에서 사용할 수없는 특정 기능이 필요한 경우 다음 EntityManager
을 호출하여 세션을 얻을 수 있습니다.
Session session = entityManager.unwrap(Session.class);
Session
에서 EntityManager
와 동일 SessionFactory.getCurrentSession()
합니까? 내 말은, Session
아직 만들어지지 않았다면 새로 열리 겠는가? 다중 스레드 환경에서 어떻게 작동합니까?
여기 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를 쉽게 조롱 할 수 있기 때문에 첫 번째 것이 더 깨끗하고 테스트하기 쉽다는 것이 분명하다고 생각합니다.
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
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 또는 Hibernate 애플리케이션을 부트 스트랩 할 때 두 가지 선택 사항이 있습니다.
SessionFactory
비아 BootstrapServiceRegistryBuilder
. Spring을 사용 LocalSessionFactoryBean
하는 경우이 GitHub 예제에 설명 된 것처럼 최대 절전 모드 부트 스트랩은을 통해 수행됩니다 .EntityManagerFactory
통해 JPA 를 만들 수 있습니다 . Spring을 사용 하는 경우이 GitHub 예제에서 설명하는 것처럼 JPA 부트 스트랩은을 통해 수행됩니다 .Persistence
EntityManagerFactoryBuilder
LocalContainerEntityManagerFactoryBean
JPA를 통한 부트 스트랩이 선호됩니다. JPA FlushModeType.AUTO
가 레거시보다 훨씬 나은 선택 이기 때문에 네이티브 SQL 쿼리에 대한 읽기-쓰기 일관성FlushMode.AUTO
이 깨지기 때문 입니다.
또한 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에 캐스트를 입력 할 수 있습니다.
EntityManager 인터페이스는 최대 절전 모드에서 sessionFactory와 유사합니다. javax.persistance 패키지 하의 EntityManager, org.hibernate.Session / sessionFactory 패키지 하의 session 및 sessionFactory
엔티티 관리자는 JPA에 고유하며 session / sessionFactory는 최대 절전 모드에 해당합니다.