私はHibernateを初めて使用し、SessionFactory
またはEntityManagerFactory
を使用してhibernateセッションを取得するかどうかは不明です。 2つの違いは何ですか?長所短所?
EntityManagerFactory
およびEntityManager
を優先します。これらはJPA標準で定義されています。
SessionFactory
およびSession
は、休止状態固有です。 EntityManager
は、内部で休止状態セッションを呼び出します。また、EntityManager
で使用できない特定の機能が必要な場合は、次を呼び出してセッションを取得できます。
Session session = entityManager.unwrap(Session.class);
これに加えて、EntityManager
からgetDelegate()
メソッドを呼び出してHibernateのセッションを取得することもできます。
例:
Session session = (Session) entityManager.getDelegate();
EntityManagerFactoryアプローチを使用すると、追加設定なしで@ PrePersist、@ PostPersist、@ PreUpdateなどのコールバックメソッドアノテーションを使用できます。
SessionFactoryの使用中に同様のコールバックを使用するには、特別な努力が必要です。
関連するHibernateドキュメントは here および here にあります。
関連するSOFの質問 および 春のフォーラムの議論
私は、EntityManager
よりもJPA2 SessionFactory
APIの方が好きです。簡単な例:
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は簡単にモック化できるため、最初のものはよりクリーンに見え、テストも容易であることが明らかだと思います。
EntityManagerを使用することで、コードは休止状態と密接に結び付けられなくなりました。しかし、このためには、使用中に使用する必要があります:
javax.persistence.EntityManager
の代わりに
org.hibernate.ejb.HibernateEntityManager
同様に、EntityManagerFactoryの場合は、javaxインターフェイスを使用します。これにより、コードは疎結合になります。休止状態よりも優れたJPA 2実装がある場合、切り替えは簡単です。極端な場合、HibernateEntityManagerへのキャストを入力できます。
EntityManagerFactoryは標準の実装であり、すべての実装で同じです。 EclipseLinkのような他のプロバイダー用にORMを移行する場合、トランザクションを処理する方法に変更はありません。対照的に、Hibernateのセッションファクトリを使用する場合、Hibernate APIに関連付けられているため、新しいベンダーに移行できません。
EntityManagerインターフェースは、hibernateのsessionFactoryに似ています。 javax.persistanceパッケージの下のEntityManagerですが、org.hibernate.Session/sessionFactoryパッケージの下のsessionおよびsessionFactory。
エンティティマネージャはJPA固有であり、session/sessionFactoryは休止状態固有です。