Я новичок в Hibernate, и я не уверен, использовать ли Hibernate SessionFactory
или JPA EntityManagerFactory
для создания Hibernate Session
.
В чем разница между этими двумя? Каковы плюсы и минусы использования каждого из них?
Я новичок в Hibernate, и я не уверен, использовать ли Hibernate SessionFactory
или JPA EntityManagerFactory
для создания Hibernate Session
.
В чем разница между этими двумя? Каковы плюсы и минусы использования каждого из них?
Ответы:
Предпочитаю
EntityManagerFactory
иEntityManager
. Они определены стандартом JPA.SessionFactory
иSession
специфичны для спящего режима.EntityManager
Вызывает сеанс спящего режима под капотом. И если вам нужны некоторые специфические функции, которые не доступны вEntityManager
, вы можете получить сеанс, позвонив:источник
Session
отEntityManager
, так же какSessionFactory.getCurrentSession()
? Я имею в виду, откроетсяSession
ли оно новым, если оно еще не создано? Как это работает в многопоточной среде?Я хочу добавить к этому, что вы также можете получить сессию Hibernate, вызвав
getDelegate()
метод изEntityManager
.например:
источник
unwrap()
это должно быть предпочтительнее, чем вgetDelegate()
соответствии с документами Java: Java 6 и Java 7 .Я предпочитаю JPA2
EntityManager
APISessionFactory
, потому что он более современный. Один простой пример:JPA:
SessionFactory:
Я думаю, что ясно, что первый выглядит чище, а также его легче тестировать, потому что EntityManager легко подделывается.
источник
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
Использование подхода EntityManagerFactory позволяет нам использовать аннотации методов обратного вызова, такие как @PrePersist, @ PostPersist, @ PreUpdate без дополнительной настройки.
Использование подобных обратных вызовов при использовании SessionFactory потребует дополнительных усилий.
Связанные документы Hibernate можно найти здесь и здесь .
Связанные вопросы SOF и весенний форум
источник
SessionFactory
противEntityManagerFactory
Как я объяснил в Руководстве пользователя Hibernate , Hibernate
SessionFactory
расширяет JPAEntityManagerFactory
, как показано на следующей диаграмме:Таким образом,
SessionFactory
это также JPAEntityManagerFactory
.Оба
SessionFactory
иEntityManagerFactory
содержат метаданные отображения сущностей и позволяют вам создавать HibernateSession
или aEntityManager
.Session
противEntityManager
Так же как
SessionFactory
иEntityManagerFactory
, HibernateSession
расширяет JPAEntityManager
. Итак, все методы, определенные вEntityManager
, доступны в HibernateSession
.Session
И `EntityManager переводить переходы между состояниями сущностей в операторы SQL, как SELECT, INSERT, UPDATE и DELETE.Hibernate против JPA начальной загрузки
При начальной загрузке приложения JPA или Hibernate у вас есть два варианта:
SessionFactory
помощьюBootstrapServiceRegistryBuilder
. Если вы используете Spring, начальная загрузка Hibernate выполняется черезLocalSessionFactoryBean
, как показано в этом примере GitHub .EntityManagerFactory
черезPersistence
класс илиEntityManagerFactoryBuilder
. Если вы используете Spring, начальная загрузка JPA выполняется черезLocalContainerEntityManagerFactoryBean
, как показано в этом примере GitHub .Начальная загрузка через JPA должна быть предпочтительной. Это потому, что JPA
FlushModeType.AUTO
является гораздо лучшим выбором, чем унаследованная версияFlushMode.AUTO
, которая нарушает согласованность операций чтения и записи для собственных запросов SQL .Развертывание JPA в Hibernate
Кроме того, если вы загружаете через JPA, и вы добавили аннотацию
EntityManagerFactory
через@PersistenceUnit
:Вы можете легко получить доступ к базовому,
Sessionfactory
используяunwrap
метод:То же самое можно сделать с JPA
EntityManager
. Если вы вводитеEntityManager
через@PersistenceContext
аннотацию:Вы можете легко получить доступ к базовому,
Session
используяunwrap
метод:Вывод
Таким образом, вы должны загружать через JPA, использовать
EntityManagerFactory
иEntityManager
и развертывать их только в связанных с ними интерфейсах Hibernate, когда вы хотите получить доступ к некоторым специфичным для Hibernate методам, которые недоступны в JPA, например, к извлечению объекта через его естественный идентификатор .источник
Используя EntityManager, код больше не тесно связан с Hibernate. Но для этого в использовании мы должны использовать:
вместо того
Аналогично, для EntityManagerFactory используйте интерфейс javax. Таким образом, код слабо связан. Если реализация JPA 2 лучше, чем в спящем режиме, переключение будет простым. В крайнем случае мы можем ввести приведение к HibernateEntityManager.
источник
EntityManagerFactory является стандартной реализацией, она одинакова для всех реализаций. Если вы перенесете ORM на любого другого провайдера, такого как EclipseLink, подход к обработке транзакции не изменится. Напротив, если вы используете фабрику сессий hibernate, она привязана к API hibernate и не может перейти на нового поставщика.
источник
Интерфейс EntityManager похож на sessionFactory в спящем режиме. EntityManager в пакете javax.persistance, но session и sessionFactory в пакете org.hibernate.Session / sessionFactory.
Менеджер сущностей специфичен для JPA, а session / sessionFactory - для режима гибернации.
источник