it-swarm.com.de

Hibernate SessionFactory vs. EntityManagerFactory

Ich bin neu in Hibernate und weiß nicht, ob ich eine SessionFactory oder EntityManagerFactory verwenden soll, um die Hibernate-Sitzung zu erhalten. Was ist der Unterschied zwischen den beiden? Für und Wider?

218
elpisu

EntityManagerFactory und EntityManager vorziehen. Sie werden durch den JPA-Standard definiert.

SessionFactory und Session sind hibernatenspezifisch. Die Variable EntityManager ruft die Hibernatsitzung unter der Haube auf. Wenn Sie bestimmte Funktionen benötigen, die in der Variablen EntityManager nicht verfügbar sind, können Sie die Sitzung abrufen, indem Sie Folgendes aufrufen:

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

Ich möchte hinzufügen, dass Sie auch die Hibernate-Sitzung abrufen können, indem Sie die getDelegate()-Methode von EntityManager aufrufen.

ex:

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

Die Verwendung des EntityManagerFactory-Ansatzes ermöglicht die Verwendung von Callback-Methodenanmerkungen wie @PrePersist, @ PostPersist und @ PreUpdate ohne zusätzliche Konfiguration. 

Die Verwendung ähnlicher Rückrufe während der Verwendung von SessionFactory erfordert zusätzliche Anstrengungen.

Verwandte Hibernate-Dokumente finden Sie hier und hier .

Verwandte SOF-Frage und Frühjahrsforendiskussion

20
Kumar Sambhav

Ich ziehe die JPA2 EntityManager-API der SessionFactory vor, da sie sich moderner anfühlt. Ein einfaches Beispiel:

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;
}

Ich denke, es ist klar, dass der erste sauberer aussieht und auch einfacher zu testen ist, da EntityManager leicht verspottet werden kann.

15
Bastian Voigt

Durch die Verwendung von EntityManager ist Code nicht mehr eng an den Ruhezustand gekoppelt. Aber dafür sollten wir im Gebrauch verwenden:

javax.persistence.EntityManager

anstatt 

org.hibernate.ejb.HibernateEntityManager

Verwenden Sie für EntityManagerFactory die Javax-Schnittstelle. Auf diese Weise ist der Code lose gekoppelt. Wenn es eine bessere JPA-2-Implementierung als im Ruhezustand gibt, wäre das Umschalten einfach. Im Extremfall könnten wir die Umwandlung in HibernateEntityManager eingeben. 

2
Sairam Krish

EntityManagerFactory ist die Standardimplementierung und für alle Implementierungen gleich. Wenn Sie Ihren ORM für einen anderen Anbieter wie EclipseLink migrieren, ändert sich nichts an der Vorgehensweise bei der Abwicklung der Transaktion. Wenn Sie dagegen die Sitzungsfactory des Ruhezustands verwenden, ist diese an die Ruhezustands-APIs gebunden und kann nicht auf einen neuen Anbieter migriert werden.

1
Segun Emmanuel

Die EntityManager-Schnittstelle ähnelt sessionFactory in hibernate . EntityManager im Paket javax.persistance, session und sessionFactory im Paket org.hibernate.Session/sessionFactory.

Entity Manager ist JPA-spezifisch und session/sessionFactory sind hibernatenspezifisch.

0