284

私はHibernateを初めて使用しますが、Hibernateを使用するかSessionFactoryJPAEntityManagerFactoryを使用してHibernateを作成するかがわかりませんSession

これら2つの違いは何ですか?それらのそれぞれを使用することの長所と短所は何ですか?

4

8 に答える 8

392

優先EntityManagerFactoryしてEntityManager。それらはJPA標準によって定義されています。

SessionFactory休止状態にSession固有です。は、内部で休止状態のEntityManagerセッションを呼び出します。また、で利用できない特定の機能が必要な場合はEntityManager、次のコマンドを呼び出してセッションを取得できます。

Session session = entityManager.unwrap(Session.class);
于 2011-04-12T19:52:32.360 に答える
52

SessionFactory対。EntityManagerFactory

Hibernateユーザーガイドで説明したように、Hibernateは次の図に示すようSessionFactoryにJPAを拡張します。EntityManagerFactory

JPAとHibernateの関係

したがって、これSessionFactoryもJPAEntityManagerFactoryです。

SessionFactoryとにはエンティティマッピングメタデータが含まれてEntityManagerFactoryおり、HibernateSessionまたはを作成できますEntityManager

Session対。EntityManager

SessionFactoryおよびと同様EntityManagerFactoryに、HibernateSessionはJPAを拡張しEntityManagerます。したがって、によって定義されたすべてのメソッドEntityManagerはHibernateで使用できますSession

Sessionおよび`EntityManagerは、エンティティの状態遷移をSELECT、INSERT、UPDATE、DELETEなどのSQLステートメントに変換します。

HibernateとJPAのブートストラップ

JPAまたはHibernateアプリケーションをブートストラップする場合、2つの選択肢があります。

  1. Hibernateネイティブメカニズムを介してブートストラップし、をSessionFactory介してを作成できますBootstrapServiceRegistryBuilder。Springを使用している場合、このGitHubの例LocalSessionFactoryBeanに示されているように、Hibernateブートストラップはを介して実行されます。
  2. または、クラスまたはEntityManagerFactoryを介してJPAを作成できます。Springを使用している場合、JPAブートストラップは、このGitHubの例に示されているように、を介して実行されます。PersistenceEntityManagerFactoryBuilderLocalContainerEntityManagerFactoryBean

JPAを介したブートストラップが推奨されます。これは、JPAが、ネイティブSQLクエリの読み取りと書き込みの一貫性を損なうレガシーFlushModeType.AUTOよりもはるかに優れた選択肢であるためです。FlushMode.AUTO

JPAをHibernateにアンラップする

また、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インターフェースにアンラップする必要があります。たとえば、自然識別子を介してエンティティをフェッチする場合などです。

于 2020-02-22T17:14:51.787 に答える
32

getDelegate()これに加えて、からメソッドを呼び出すことでHibernateのセッションを取得することもできますEntityManager

元:

Session session = (Session) entityManager.getDelegate();
于 2013-01-19T06:51:10.220 に答える
24

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は簡単にモックできるので、最初のものは見た目がすっきりしていて、テストも簡単であることは明らかだと思います。

于 2015-03-04T08:46:48.110 に答える
23

EntityManagerFactoryアプローチを使用すると、追加の構成なしで@ PrePersist、@ PostPersist、@PreUpdateなどのコールバックメソッドアノテーションを使用できます。

SessionFactoryの使用中に同様のコールバックを使用するには、追加の作業が必要になります。

関連するHibernateドキュメントはここここにあります。

関連するSOF質問とSpringForumディスカッション

于 2013-09-09T10:29:29.670 に答える
2

EntityManagerを使用することにより、コードは休止状態と緊密に結合されなくなります。しかし、これには、使用法で使用する必要があります:

javax.persistence.EntityManager

それ以外の

org.hibernate.ejb.HibernateEntityManager

同様に、EntityManagerFactoryには、javaxインターフェイスを使用します。このように、コードは緩く結合されます。休止状態よりも優れたJPA2実装があれば、切り替えは簡単です。極端な場合、HibernateEntityManagerにキャストと入力できます。

于 2014-09-26T11:56:02.397 に答える
2

EntityManagerFactoryは標準の実装であり、すべての実装で同じです。EclipseLinkなどの他のプロバイダーにORMを移行する場合、トランザクションを処理するためのアプローチに変更はありません。対照的に、hibernateのセッションファクトリを使用する場合、hibernate APIに関連付けられており、新しいベンダーに移行できません。

于 2019-07-07T16:16:55.177 に答える
1

EntityManagerインターフェースはHibernateのsessionFactoryに似ています。EntityManagerはjavax.persistanceパッケージの下にありますが、sessionとsessionFactoryはorg.hibernate.Session/sessionFactoryパッケージの下にあります。

エンティティマネージャーはJPA固有であり、session/sessionFactoryは休止状態固有です。

于 2018-07-24T10:16:42.687 に答える