私はHibernateを初めて使用しますが、Hibernateを使用するかSessionFactory
JPAEntityManagerFactory
を使用してHibernateを作成するかがわかりませんSession
。
これら2つの違いは何ですか?それらのそれぞれを使用することの長所と短所は何ですか?
私はHibernateを初めて使用しますが、Hibernateを使用するかSessionFactory
JPAEntityManagerFactory
を使用してHibernateを作成するかがわかりませんSession
。
これら2つの違いは何ですか?それらのそれぞれを使用することの長所と短所は何ですか?
優先EntityManagerFactory
してEntityManager
。それらはJPA標準によって定義されています。
SessionFactory
休止状態にSession
固有です。は、内部で休止状態のEntityManager
セッションを呼び出します。また、で利用できない特定の機能が必要な場合はEntityManager
、次のコマンドを呼び出してセッションを取得できます。
Session session = entityManager.unwrap(Session.class);
SessionFactory
対。EntityManagerFactory
Hibernateユーザーガイドで説明したように、Hibernateは次の図に示すようSessionFactory
にJPAを拡張します。EntityManagerFactory
したがって、これSessionFactory
もJPAEntityManagerFactory
です。
SessionFactory
とにはエンティティマッピングメタデータが含まれてEntityManagerFactory
おり、HibernateSession
またはを作成できますEntityManager
。
Session
対。EntityManager
SessionFactory
およびと同様EntityManagerFactory
に、HibernateSession
はJPAを拡張しEntityManager
ます。したがって、によって定義されたすべてのメソッドEntityManager
はHibernateで使用できますSession
。
Session
および`EntityManagerは、エンティティの状態遷移をSELECT、INSERT、UPDATE、DELETEなどのSQLステートメントに変換します。
JPAまたはHibernateアプリケーションをブートストラップする場合、2つの選択肢があります。
SessionFactory
介してを作成できますBootstrapServiceRegistryBuilder
。Springを使用している場合、このGitHubの例LocalSessionFactoryBean
に示されているように、Hibernateブートストラップはを介して実行されます。EntityManagerFactory
を介してJPAを作成できます。Springを使用している場合、JPAブートストラップは、このGitHubの例に示されているように、を介して実行されます。Persistence
EntityManagerFactoryBuilder
LocalContainerEntityManagerFactoryBean
JPAを介したブートストラップが推奨されます。これは、JPAが、ネイティブSQLクエリの読み取りと書き込みの一貫性を損なうレガシーFlushModeType.AUTO
よりもはるかに優れた選択肢であるためです。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インターフェースにアンラップする必要があります。たとえば、自然識別子を介してエンティティをフェッチする場合などです。
getDelegate()
これに加えて、からメソッドを呼び出すことでHibernateのセッションを取得することもできますEntityManager
。
元:
Session session = (Session) entityManager.getDelegate();
JPA2 EntityManager
APIのSessionFactory
方がモダンな感じがするので、私はJPA2APIの方が好きです。1つの簡単な例:
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インターフェイスを使用します。このように、コードは緩く結合されます。休止状態よりも優れたJPA2実装があれば、切り替えは簡単です。極端な場合、HibernateEntityManagerにキャストと入力できます。
EntityManagerFactoryは標準の実装であり、すべての実装で同じです。EclipseLinkなどの他のプロバイダーにORMを移行する場合、トランザクションを処理するためのアプローチに変更はありません。対照的に、hibernateのセッションファクトリを使用する場合、hibernate APIに関連付けられており、新しいベンダーに移行できません。
EntityManagerインターフェースはHibernateのsessionFactoryに似ています。EntityManagerはjavax.persistanceパッケージの下にありますが、sessionとsessionFactoryはorg.hibernate.Session/sessionFactoryパッケージの下にあります。
エンティティマネージャーはJPA固有であり、session/sessionFactoryは休止状態固有です。