Ich bin neu im Ruhezustand und bin mir nicht sicher, ob ich einen Ruhezustand SessionFactory
oder eine JPA verwenden soll EntityManagerFactory
, um einen Ruhezustand zu erstellen Session
.
Was ist der Unterschied zwischen diesen beiden? Was sind die Vor- und Nachteile jeder dieser Anwendungen?
Antworten:
Bevorzugen
EntityManagerFactory
undEntityManager
. Sie werden durch den JPA-Standard definiert.SessionFactory
undSession
sind hibernate-spezifisch. DerEntityManager
ruft den Ruhezustand unter der Haube auf. Und wenn Sie einige spezifische Funktionen benötigen, die in der nicht verfügbar sindEntityManager
, können Sie die Sitzung erhalten, indem Sie Folgendes aufrufen:quelle
Session
ausEntityManager
, genau wieSessionFactory.getCurrentSession()
? Ich meine, wird es neu geöffnet,Session
wenn es nicht bereits erstellt wurde? Wie funktioniert es in einer Multithread-Umgebung?Ich möchte hinzufügen, dass Sie die Sitzung von Hibernate auch erhalten können, indem Sie die
getDelegate()
Methode von aufrufenEntityManager
.Ex:
quelle
unwrap()
ist zu bevorzugen, mehr alsgetDelegate()
nach der Java - Dokumentation: JavaEE 6 und JavaEE 7 .Ich bevorzuge die JPA2-
EntityManager
APISessionFactory
, weil sie sich moderner anfühlt. Ein einfaches Beispiel:JPA:
SessionFactory:
Ich denke, es ist klar, dass der erste sauberer aussieht und auch einfacher zu testen ist, da EntityManager leicht verspottet werden kann.
quelle
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
Mit dem EntityManagerFactory-Ansatz können wir Annotationen für Rückrufmethoden wie @PrePersist, @ PostPersist, @ PreUpdate ohne zusätzliche Konfiguration verwenden.
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 Diskussion im Frühjahrsforum
quelle
SessionFactory
vs.EntityManagerFactory
Wie ich im Hibernate-Benutzerhandbuch erläutert habe , erweitert der Hibernate
SessionFactory
die JPAEntityManagerFactory
, wie in der folgenden Abbildung dargestellt:Das
SessionFactory
ist also auch ein JPAEntityManagerFactory
.Sowohl die
SessionFactory
als auch dieEntityManagerFactory
enthalten die Entitätszuordnungsmetadaten und ermöglichen Ihnen das Erstellen eines RuhezustandsSession
oder eines RuhezustandsEntityManager
.Session
vs.EntityManager
Genau wie die
SessionFactory
undEntityManagerFactory
die HibernateSession
erweitert die JPAEntityManager
. Daher sind alle durch das definierten MethodenEntityManager
im Ruhezustand verfügbarSession
.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:
SessionFactory
über denBootstrapServiceRegistryBuilder
. Wenn Sie Spring verwenden, erfolgt der Hibernate-Bootstrap überLocalSessionFactoryBean
, wie in diesem GitHub-Beispiel dargestellt .EntityManagerFactory
über diePersistence
Klasse oder die erstellenEntityManagerFactoryBuilder
. Wenn Sie Spring verwenden, erfolgt der JPA-Bootstrap überLocalContainerEntityManagerFactoryBean
, 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 LegacyFlushMode.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:Sessionfactory
Mit der folgendenunwrap
Methode können Sie problemlos auf den Basiswert zugreifen :Das gleiche kann mit der JPA gemacht werden
EntityManager
. Wenn Sie dieEntityManager
über die@PersistenceContext
Anmerkung injizieren :Session
Mit der folgendenunwrap
Methode können Sie problemlos auf den Basiswert zugreifen :Fazit
Sie sollten daher über JPA booten , das
EntityManagerFactory
und verwendenEntityManager
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 .quelle
Durch die Verwendung von EntityManager ist Code nicht mehr eng mit dem Ruhezustand verbunden. Aber dafür sollten wir im Gebrauch verwenden:
anstatt
Verwenden Sie für EntityManagerFactory ebenfalls die Javax-Schnittstelle. Auf diese Weise wird der Code lose gekoppelt. Wenn es eine bessere JPA 2-Implementierung als den Ruhezustand gibt, ist das Wechseln einfach. Im Extremfall könnten wir cast in HibernateEntityManager eingeben.
quelle
EntityManagerFactory ist die Standardimplementierung und für alle Implementierungen gleich. Wenn Sie Ihr ORM für einen anderen Anbieter wie EclipseLink migrieren, ändert sich der Ansatz für die Abwicklung der Transaktion nicht. Wenn Sie dagegen die Session Factory von Hibernate verwenden, ist diese an APIs für den Ruhezustand gebunden und kann nicht auf einen neuen Anbieter migriert werden.
quelle
Die EntityManager-Oberfläche ähnelt der sessionFactory im Ruhezustand. EntityManager unter dem Paket javax.persistance, aber session und sessionFactory unter dem Paket org.hibernate.Session / sessionFactory.
Der Entity Manager ist JPA-spezifisch und session / sessionFactory sind hibernate-spezifisch.
quelle