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?
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);
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();
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.
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.
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.
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.
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.