私はHibernateを初めて使用しますが、Hibernateを使用するかSessionFactoryJPAEntityManagerFactoryを使用してHibernateを作成するかがわかりませんSession。
これら2つの違いは何ですか?それらのそれぞれを使用することの長所と短所は何ですか?
私はHibernateを初めて使用しますが、Hibernateを使用するかSessionFactoryJPAEntityManagerFactoryを使用してHibernateを作成するかがわかりませんSession。
これら2つの違いは何ですか?それらのそれぞれを使用することの長所と短所は何ですか?
優先EntityManagerFactoryしてEntityManager。それらはJPA標準によって定義されています。
SessionFactory休止状態にSession固有です。は、内部で休止状態のEntityManagerセッションを呼び出します。また、で利用できない特定の機能が必要な場合はEntityManager、次のコマンドを呼び出してセッションを取得できます。
Session session = entityManager.unwrap(Session.class);
SessionFactory対。EntityManagerFactoryHibernateユーザーガイドで説明したように、Hibernateは次の図に示すようSessionFactoryにJPAを拡張します。EntityManagerFactory
したがって、これSessionFactoryもJPAEntityManagerFactoryです。
SessionFactoryとにはエンティティマッピングメタデータが含まれてEntityManagerFactoryおり、HibernateSessionまたはを作成できますEntityManager。
Session対。EntityManagerSessionFactoryおよびと同様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の例に示されているように、を介して実行されます。PersistenceEntityManagerFactoryBuilderLocalContainerEntityManagerFactoryBeanJPAを介したブートストラップが推奨されます。これは、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を介してブートストラップし、EntityManagerFactoryandを使用し、JPAで使用EntityManagerできないHibernate固有のメソッドにアクセスする場合にのみ、それらを関連するHibernateインターフェースにアンラップする必要があります。たとえば、自然識別子を介してエンティティをフェッチする場合などです。
getDelegate()これに加えて、からメソッドを呼び出すことでHibernateのセッションを取得することもできますEntityManager。
元:
Session session = (Session) entityManager.getDelegate();
JPA2 EntityManagerAPIの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は休止状態固有です。