Определенный способ сделать эффективные пакетные / массовые вставки с JPA и Hibernate? - PullRequest
1 голос
/ 25 октября 2011

Хотя здесь есть и другие подобные вопросы, я не видел ни одного, который затрагивал бы все вопросы или имел бы хороший окончательный ответ.По сути, я работаю над созданием уровней доступа к данным и сервисов в приложении J2EE с использованием JPA с поддержкой Hibernate.

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

  • Установка размера пакета в конфигурации или в коде, который соблюдается, и как кодироватьк этому с использованием JPA (без использования необработанного Hibernate, если это возможно)
  • как и когда использовать транзакционные команды / аннотации JPA для обеспечения эффективного использования памяти / кэша первого / второго уровня.
  • Объясните мнечто это означает «Hibernate отключает пакетную вставку на уровне JDBC прозрачно, если вы используете генератор идентификаторов идентификаторов» - это связано с использованием последовательности для первичных идентификаторов?
  • любые ошибки, о которых я должен знать.

Примечание. Я задал несколько связанных вопросов о Hibernate и J2EE / JPA, и если у вас есть что добавить к ним, пожалуйста, сделайте

Обе эти технологии относительно новые для меня (см. Мои другие вопросы):

Как использовать EntityManager в хорошо отделенном слое сервиса и данныхess layer?

и

Должны ли необработанные аннотированные POJO Hibernate возвращаться из уровня доступа к данным или интерфейсов вместо этого?

1 Ответ

3 голосов
/ 25 октября 2011

Я могу объяснить утверждение о том, что Hibernate отключает пакетные вставки, когда используется генератор идентификаторов.

Чтобы Hibernate получил идентификатор для новой сущности с использованием генератора идентификаторов, он должен фактически выполнить вставку вбазы данных, а затем выполните выбор, чтобы получить это значение идентификатора, так как это значение назначается базой данных при вставке.Это в отличие от использования генератора последовательности.В этом случае Hibernate может получить столько идентификаторов заранее (в пакетах, если требуется) и назначить их сущностям, которые он вставляет, до того, как они будут вставлены.

Таким образом, разница между «Вставить» и «Выбрать» для генератора идентификаторов против «Выбрать» и «Вставить» для последовательности.

Поэтому Hibernate должен выполнять вставки один за другим, когда используется генератор идентификаторов, но может группировать ихкогда используется генератор последовательности.

...