Нет, в vanilla JPA нет операции пакетной вставки.
Да, каждая вставка будет выполняться в рамках собственной транзакции. Атрибут @Transactional
(без квалификаторов) означает уровень распространения REQUIRED
(создать транзакцию, если она еще не существует). Предполагая, что у вас есть:
public class Dao {
@Transactional
public void insert(SomeEntity entity) {
...
}
}
вы делаете это:
public class Batch {
private Dao dao;
@Transactional
public void insert(List<SomeEntity> entities) {
for (SomeEntity entity : entities) {
dao.insert(entity);
}
}
public void setDao(Dao dao) {
this.dao = dao;
}
}
Таким образом, вся группа вставок будет заключена в одну транзакцию. Если вы говорите об очень большом количестве вставок, вы можете разбить его на группы по 1000, 10000 или что-то еще, что работает как достаточно большая незафиксированная транзакция, что может привести к истощению базы данных ресурсов и, возможно, к сбою из-за одного только размера.
Примечание: @Transactional
- это аннотация Spring. См. Управление транзакциями из справочника Spring.