SessionFactory
vs. EntityManagerFactory
Wie ich im Hibernate-Benutzerhandbuch erläutert habe , erweitert der Hibernate SessionFactory
die JPA EntityManagerFactory
, wie in der folgenden Abbildung dargestellt:
Das SessionFactory
ist also auch ein JPA EntityManagerFactory
.
Sowohl die SessionFactory
als auch die EntityManagerFactory
enthalten die Entitätszuordnungsmetadaten und ermöglichen Ihnen das Erstellen eines Ruhezustands Session
oder eines Ruhezustands EntityManager
.
Session
vs. EntityManager
Genau wie die SessionFactory
und EntityManagerFactory
die Hibernate Session
erweitert die JPA EntityManager
. Daher sind alle durch das definierten Methoden EntityManager
im Ruhezustand verfügbar Session
.
Der Session
und 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 Persistence
Klasse 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.AUTO
liegt 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 @PersistenceUnit
Annotation eingefügt haben:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
Sessionfactory
Mit der folgenden unwrap
Methode 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 @PersistenceContext
Anmerkung injizieren :
@PersistenceContext
private EntityManager entityManager;
Session
Mit der folgenden unwrap
Methode können Sie problemlos auf den Basiswert zugreifen :
Session session = entityManager.unwrap(Session.class);
Fazit
Sie sollten daher über JPA booten , das EntityManagerFactory
und verwenden EntityManager
und 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 .