SessionFactory vs. EntityManagerFactory
Wie ich im Hibernate-Benutzerhandbuch erläutert habe , erweitert der Hibernate SessionFactorydie JPA EntityManagerFactory, wie in der folgenden Abbildung dargestellt:

Das SessionFactoryist also auch ein JPA EntityManagerFactory.
Sowohl die SessionFactoryals auch die EntityManagerFactoryenthalten die Entitätszuordnungsmetadaten und ermöglichen Ihnen das Erstellen eines Ruhezustands Sessionoder eines Ruhezustands EntityManager.
Session vs. EntityManager
Genau wie die SessionFactoryund EntityManagerFactorydie Hibernate Sessionerweitert die JPA EntityManager. Daher sind alle durch das definierten Methoden EntityManagerim Ruhezustand verfügbar Session.
Der Sessionund der EntityManager übersetzen Entitätsstatusübergänge in SQL-Anweisungen wie SELECT, INSERT, UPDATE und DELETE.
Ruhezustand vs. JPA-Bootstrap
Beim Bootstrapping einer JPA- oder Hibernate-Anwendung haben Sie zwei Möglichkeiten:
- Sie können über den nativen Hibernate-Mechanismus booten und
SessionFactoryüber den BootstrapServiceRegistryBuilder. Wenn Sie Spring verwenden, erfolgt der Hibernate-Bootstrap über LocalSessionFactoryBean, wie in diesem GitHub-Beispiel dargestellt .
- Oder Sie können eine JPA
EntityManagerFactoryüber die PersistenceKlasse oder die erstellen EntityManagerFactoryBuilder. Wenn Sie Spring verwenden, erfolgt der JPA-Bootstrap über LocalContainerEntityManagerFactoryBean, wie in diesem GitHub-Beispiel dargestellt .
Bootstrapping über JPA ist zu bevorzugen. Dies FlushModeType.AUTOliegt daran, dass der JPA eine viel bessere Wahl ist als das Legacy FlushMode.AUTO, wodurch die Konsistenz beim Lesen und Schreiben für native SQL-Abfragen beeinträchtigt wird .
JPA in den Ruhezustand auspacken
Wenn Sie über JPA booten und das EntityManagerFactoryüber die @PersistenceUnitAnnotation eingefügt haben:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
SessionfactoryMit der folgenden unwrapMethode können Sie problemlos auf den Basiswert zugreifen :
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Das gleiche kann mit der JPA gemacht werden EntityManager. Wenn Sie die EntityManagerüber die @PersistenceContextAnmerkung injizieren :
@PersistenceContext
private EntityManager entityManager;
SessionMit der folgenden unwrapMethode können Sie problemlos auf den Basiswert zugreifen :
Session session = entityManager.unwrap(Session.class);
Fazit
Sie sollten daher über JPA booten , das EntityManagerFactoryund verwenden EntityManagerund diese nur dann in die zugehörigen Hibernate-Schnittstellen auspacken, wenn Sie Zugriff auf einige Hibernate-spezifische Methoden erhalten möchten, die in JPA nicht verfügbar sind, z. B. das Abrufen der Entität über ihre natürliche Kennung .