Подтвердить что ты не робот

Использовать hibernate sessionFactory или JPA entityManager?

Я работаю над проектом, который использует Hibernate 4.1, Spring 3.1 и JPA 2.0, и я хочу проверить, что то, что я почерпнул из Интернета, является правильным.

Я пытаюсь решить, использовать ли сущностьManager JPA или сессионную среду, зависящую от гибернации.

Сначала я планировал использовать сущностьManager и полные спецификации JPA, поэтому мой проект будет отделен от Hibernate, и я мог бы переключить его на что-то еще, скажем, EclipseLink, если это меня увлекло, или что-то в этом убедили позже.

Однако, кажется, что у entityManager есть некоторые очень существенные ограничения.

Мои вопросы:

Единственная причина, по которой я хочу использовать полные спецификации JPA, и entityManager должен иметь возможность легко отключать Hibernate для другой ORM, совместимой с JPA 2.0, правильно? Неужели нет производительности/функциональности/удобства программирования при использовании entityManager?

Во-вторых, похоже, что спящий режим sessionFactory имеет много преимуществ над entityManager. До сих пор я столкнулся с проблемой, что entityManager не может выполнить пакетную вставку списка объектов, которые я прочитал в файле sessionFactory. Я также прочитал, что sessionFactory автоматически возвращает автоматически сгенерированный идентификатор объекта, в то время как с помощью entityManager вам необходимо завершить транзакцию/очистить контекст персистентности, чтобы вытащить вновь сгенерированный идентификатор.

Мне понравилась идея, что мой проект относительно отделен от Hibernate, но я бы скорее смог написать эффективные обновления баз данных с самого начала. Поэтому я должен переключиться на мой проект, настроенный для спящего режима и sessionFactory, правильно?

4b9b3361

Ответ 1

Я бы придерживался JPA2, как вы бы использовали List, а не ArrayList: вы пользуетесь интерфейсом (или абстрактным) над реализацией. Нет большой разницы, кроме того, что HQL знает "больше", чем JPQL или экзотическая функция. Также помните, что JPA был создан после Hibernate, а Hibernate - "вдохновение" за JPA.

И для экзотической функции: Hibernate Entity Manager переносит сеанс Hibernate. Если они вам действительно нужны, вы можете применить EntityManager к интерфейсу Hibernate (org.hibernate.jpa.HibernateEntityManager) и использовать этот сеанс. Но я буду лгать вам, если скажу, что попробовал.

Я также прокомментировал часть вашего вопроса:

Единственная причина, по которой я хочу использовать полные спецификации JPA и entityManager должен иметь возможность отключать Hibernate для другого JPA 2.0 совместимый ORM относительно легко, не так ли? Действительно ли нет производительность/функциональность/легкость программирования при использовании entityManager?

Переключение с Hibernate на EclipseLink не означает, что вам "нужно только обменивать банку". Отображение и анализ аннотаций не совпадают, и вы столкнетесь с проблемами, которые, вероятно, будут препятствовать вам переключиться.

Вы можете прочитать мой вопрос здесь для примера проблемы, с которой я столкнулся при использовании обоих (это был проект maven с профилем для переключения JPA2.1 impl из EclipseLink в Hibernate). Я потерял EclipseLink, потому что я не мог назвать объект базы данных (точнее, указать имя объекта базы данных), как я хотел.

Во-вторых, похоже, что сессия hibernate sessionFactory имеет много преимущества над entityManager. До сих пор я столкнулся с проблемой, которая entityManager не может выполнять пакетную вставку списка объектов, который я прочитал sessionFactory. Я также прочитал, что sessionFactory может автоматически возвращать автоматически сгенерированный идентификатор объекта, в то время как с помощью entityManager вам необходимо завершить транзакцию/флеш контекст персистентности, чтобы вытащить вновь сгенерированный идентификатор.

Это зависит от того, как вы создаете свой идентификатор объекта. Но подумайте об этом: вы не сохраняетесь до тех пор, пока контекст персистентности не сможет его сохранить. Вот почему у вас нет идентификатора. Промывка его, иначе отправляющая запрос вставки с сгенерированным идентификатором, является единственным способом сделать это.

То же самое относится к сессионным фабрикам.

Однако вы можете получить доступ к генератору последовательности из Hibernate, но вы также можете сделать это в нативном SQL с EntityManager.

Мне понравилась идея, что мой проект относительно отделен от Hibernate, но я бы скорее мог написать эффективную базу данных обновления от get-go. Поэтому я должен переключиться на мой проект, настроен для спящего режима и sessionFactory, правильно?

Вы можете взять его как тролль против ORM, но для эффективного обновления базы данных используйте простой JDBC (или Spring шаблон Jdbc). По крайней мере, вы узнаете, когда данные будут обновлены, и вы сможете лучше оптимизировать (пакетное обновление и т.д.).

Ответ 2

JPA - это интерфейс по Hibernate, который является интерфейсом по jdbc, поэтому чем ближе вы будете к jdbc, тем больше контроля вы получите над своими запросами, а дальше вы перейдете от объектно-реляционной настойчивости. Да, в Hibernate могут быть некоторые инструменты, которые jpa может не предоставлять в данный момент (т.е. Спящий режим) Hibernate - это весело и может использовать аннотации JPA для сопоставления модели домена (если вы переходите через аннотации через файлы .hbm). И способ, которым аннотация @Transactional работает в Spring, не имеет значения, используете ли вы hibernate или jpa, поскольку вам не нужна session.open()... session.beginTranscation... session.close... и т.д. Все этот подробный код Hibernate отсутствует! Существует отличная документация по Hibernate и greate books. Что касается JPA, я не могу сказать, что нашел книгу umber...