Jestem nowy w Hibernacji i nie jestem pewien, czy użyć Hibernacji, SessionFactory
czy JPA, EntityManagerFactory
aby utworzyć Hibernację Session
.
Jaka jest różnica między tymi dwoma? Jakie są zalety i wady korzystania z każdego z nich?
Jestem nowy w Hibernacji i nie jestem pewien, czy użyć Hibernacji, SessionFactory
czy JPA, EntityManagerFactory
aby utworzyć Hibernację Session
.
Jaka jest różnica między tymi dwoma? Jakie są zalety i wady korzystania z każdego z nich?
Odpowiedzi:
Wolę
EntityManagerFactory
iEntityManager
. Są one zdefiniowane w standardzie JPA.SessionFactory
iSession
są specyficzne dla hibernacji.EntityManager
Wywołuje sesji hibernacji pod maską. A jeśli potrzebujesz określonych funkcji, które nie są dostępne wEntityManager
, możesz uzyskać sesję, dzwoniąc:źródło
Session
odEntityManager
, tak samo jakSessionFactory.getCurrentSession()
? Mam na myśli, czy otworzy się nowy,Session
jeśli jeszcze nie został utworzony? Jak to działa w środowisku wielowątkowym?Chcę dodać, że możesz także uzyskać sesję Hibernacji, wywołując
getDelegate()
metodę zEntityManager
.dawny:
źródło
unwrap()
to preferowane przezgetDelegate()
według Dokumenty JAVA: JavaEE 6 i JavaEE 7 .Wolę
EntityManager
API JPA2 niżSessionFactory
, ponieważ wydaje się bardziej nowoczesny. Jeden prosty przykład:JPA:
SessionFactory:
Myślę, że jasne jest, że pierwszy wygląda na czystszy i łatwiej go przetestować, ponieważ EntityManager można łatwo wyśmiewać.
źródło
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
Korzystanie z podejścia EntityManagerFactory pozwala nam korzystać z adnotacji metod wywołania zwrotnego, takich jak @PrePersist, @ PostPersist, @ PreUpdate bez dodatkowej konfiguracji.
Korzystanie z podobnych wywołań zwrotnych podczas korzystania z SessionFactory będzie wymagać dodatkowych wysiłków.
Powiązane dokumenty Hibernacja można znaleźć tutaj i tutaj .
Powiązane pytanie SOF i dyskusja na forum wiosennym
źródło
SessionFactory
vs.EntityManagerFactory
Jak wyjaśniłem w Przewodniku użytkownika Hibernacji , Hibernacja
SessionFactory
rozszerza JPAEntityManagerFactory
, co ilustruje poniższy schemat:Tak,
SessionFactory
to również JPAEntityManagerFactory
.Zarówno
SessionFactory
iEntityManagerFactory
zawierają metadane odwzorowania encji i umożliwiają utworzenie hibernacjiSession
lub aEntityManager
.Session
vs.EntityManager
Podobnie jak
SessionFactory
iEntityManagerFactory
HibernacjaSession
rozszerza JPAEntityManager
. Tak więc wszystkie metody zdefiniowane przezEntityManager
są dostępne w HibernacjiSession
.A
Session
oraz `EntityManager tłumaczą przejścia stanu encji na instrukcje SQL, takie jak SELECT, INSERT, UPDATE i DELETE.Hibernacja kontra bootstrap JPA
Podczas ładowania aplikacji JPA lub Hibernacji masz dwie możliwości:
SessionFactory
pomocąBootstrapServiceRegistryBuilder
. Jeśli używasz Springa, Hibernacja bootstrap odbywa się za pomocąLocalSessionFactoryBean
, jak pokazano w tym przykładzie GitHub .EntityManagerFactory
za pośrednictwemPersistence
klasy lubEntityManagerFactoryBuilder
. Jeśli używasz Springa, bootstrap JPA odbywa się za pomocąLocalContainerEntityManagerFactoryBean
, jak pokazano w tym przykładzie GitHub .Preferowane jest ładowanie poprzez JPA. Jest tak, ponieważ JPA
FlushModeType.AUTO
jest znacznie lepszym wyborem niż starsza wersjaFlushMode.AUTO
, która łamie spójność odczytu i zapisu w rodzimych zapytaniach SQL .Rozpakowywanie JPA do Hibernacji
Ponadto, jeśli bootstrap przez WZP, a ty wstrzyknął
EntityManagerFactory
pośrednictwem@PersistenceUnit
adnotacji:Możesz łatwo uzyskać dostęp do instrumentu bazowego
Sessionfactory
za pomocąunwrap
metody:To samo można zrobić z WZP
EntityManager
. Jeśli wstrzyknąćEntityManager
za pomocą@PersistenceContext
adnotacji:Możesz łatwo uzyskać dostęp do instrumentu bazowego
Session
za pomocąunwrap
metody:Wniosek
Tak więc powinieneś bootować pasek za pomocą JPA, używać
EntityManagerFactory
iEntityManager
, i rozpakowywać je do powiązanych interfejsów Hibernacja tylko wtedy, gdy chcesz uzyskać dostęp do niektórych specyficznych metod Hibernacji, które nie są dostępne w JPA, takich jak pobieranie encji za pomocą jej naturalnego identyfikatora .źródło
Korzystając z EntityManager, kod nie jest już ściśle powiązany z hibernacją. Ale w tym celu w użyciu powinniśmy użyć:
zamiast
Podobnie dla EntityManagerFactory użyj interfejsu javax. W ten sposób kod jest luźno powiązany. Jeśli istnieje lepsza implementacja JPA 2 niż hibernacja, przełączanie byłoby łatwe. W skrajnym przypadku możemy wpisać cast do HibernateEntityManager.
źródło
EntityManagerFactory to standardowa implementacja, jest taka sama we wszystkich implementacjach. W przypadku migracji ORM dla dowolnego innego dostawcy, takiego jak EclipseLink, nie będzie żadnych zmian w podejściu do obsługi transakcji. Natomiast w przypadku korzystania z fabryki sesji hibernacji jest ona powiązana z interfejsami API hibernacji i nie można przeprowadzić migracji do nowego dostawcy.
źródło
Interfejs EntityManager jest podobny do sessionFactory w trybie hibernacji. EntityManager w pakiecie javax.persistance, ale session & sessionFactory w org.hibernate.Session / sessionFactory.
Menedżer jednostek jest specyficzny dla JPA, a sesja / sesja jest specyficzna dla hibernacji.
źródło