Мне нужно обновить тысячи сущностей, и логика не может быть помещена в инструкцию SQL. При использовании неуправляемого JPA я использую следующий шаблон:
long commitThreshold = 100; // or other appropriate value
try {
em.beginTransction().begin();
for(list of entities to be modified) {
// retrieve current Entity
// modify current Entity
if((++modifiedEntityCount % commitThreshold) == 0) {
em.getTransaction().commit();
em.getTransaction().begin();
}
}
if(em.getTransaction().isActive()) {
em.getTransaction().commit();
}
catch () {
}
finally {
// cleanup
}
В управляемой среде это приводит к
java.lang.IllegalStateException: Transaction management is not available for container managed EntityManagers.
Каков хороший шаблон для этого типа использования при использовании транзакций, управляемых контейнером, и схемы? Моя конкретная среда — это karaf 3.0.5 и openJPA 2.3.x, если это имеет значение.