Ответ 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). По крайней мере, вы узнаете, когда данные будут обновлены, и вы сможете лучше оптимизировать (пакетное обновление и т.д.).