Вот простой пример, который я создал после чтения нескольких тем о вставках jpa bulk, у меня есть 2 постоянных объекта User и Site. У одного пользователя может быть много сайтов, поэтому у нас есть от одного до многих отношений. Предположим, я хочу создать пользователя и создать/связать несколько сайтов с учетной записью пользователя. Вот как выглядит код, учитывая, что я готов использовать объемную вставку для объектов сайта.
User user = new User("John Doe");
user.getSites().add(new Site("google.com", user));
user.getSites().add(new Site("yahoo.com", user));
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
Но когда я запускаю этот код (я использую hibernate как поставщик реализации jpa), я вижу следующий вывод sql:
Hibernate: insert into User (id, name) values (null, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Итак, я имею в виду, что "настоящая" объемная вставка не работает или я смущен?
Вот исходный код для этого примера проекта, это проект maven, поэтому вы можете загружать и запускать mvn install для проверки вывода.
ОБНОВЛЕНО:
После того, как Кен Лю любезно сообщит, я отключил автоматическую генерацию объекта объекта сайта:
User user = new User("John Doe");
user.getSites().add(new Site(1, "google.com", user));
user.getSites().add(new Site(2, "yahoo.com", user));
entityManager.setFlushMode(FlushModeType.COMMIT);
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
Теперь у меня есть следующая строка в отладочном выходе:
DEBUG: org.hibernate.jdbc.AbstractBatcher - Выполнение размера партии: 2
Это работает!