web-dev-qa-db-ja.com

Hibernate SessionFactoryとEntityManagerFactory

私はHibernateを初めて使用し、SessionFactoryまたはEntityManagerFactoryを使用してhibernateセッションを取得するかどうかは不明です。 2つの違いは何ですか?長所短所?

224
elpisu

EntityManagerFactoryおよびEntityManagerを優先します。これらはJPA標準で定義されています。

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

Session session = entityManager.unwrap(Session.class);
339
Bozho

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

例:

Session session = (Session) entityManager.getDelegate();
30
toytoy

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

SessionFactoryの使用中に同様のコールバックを使用するには、特別な努力が必要です。

関連するHibernateドキュメントは here および here にあります。

関連するSOFの質問 および 春のフォーラムの議論

20
Kumar Sambhav

私は、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は簡単にモック化できるため、最初のものはよりクリーンに見え、テストも容易であることが明らかだと思います。

17
Bastian Voigt

EntityManagerを使用することで、コードは休止状態と密接に結び付けられなくなりました。しかし、このためには、使用中に使用する必要があります:

javax.persistence.EntityManager

の代わりに

org.hibernate.ejb.HibernateEntityManager

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

2
Sairam Krish

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

1
Segun Emmanuel

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

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

0