Я использую JPA 2.1, Oracle DB и имею список идентификаторов для объектов, подлежащих удалению (около 430000 идентификаторов). Сначала он был реализован как разделение этого списка идентификаторов на каждый меньший с 1000 идентификаторами, передачу их в качестве параметров для JPQL и выполнение.JPA CriteriaDelete с огромными параметрами
delete from SOPFilter f where f.id in (?1)
Тогда, я хочу изменить, чтобы использовать JPA CriteriaDelete.
CriteriaDelete<SOPFilter> criteriaDelete = cb.createCriteriaDelete(SOPFilter.class);
Root<SOPFilter> from = criteriaDelete.from(SOPFilter.class);
criteriaDelete.where(from.get(SOPFilter_.id).in(sopFilterIds));
Он работает прекрасно, пока он не достигнет 90000th один и есть исключение времени выполнения причиной его остановить здесь
org.hibernate.SessionException: Сессия закрыта
и сделать заведующий фабрикой предприятий.
INFO: bernate.impl.StmpContainerEntityManagerFactoryBean: Закрытие JPA EntityManagerFactory для сохранения состояния блока 'IMOFFERINGMANAGEMENT'
Для кого был введен в заблуждение мой первый пост с этим исключением
java.lang. IllegalStateException: EntityManagerFactory закрыт
Был улов cl ause для обработки исключения времени выполнения, добавляя запись в базу данных, прежде чем бросать ее. И чтобы добавить запись о событии, она пытается создать еще один сундук из фабрики, который теперь закрыт.
public static void logEvent(EntityManager em) {
EntityManager em2 = null;
EntityManagerFactory emFactory = em.getEntityManagerFactory();
em2 = emFactory.createEntityManager();
// ...
}
Может ли кто-нибудь пролить свет на него?
Дают еще некоторые детали, как вы используете JPA CriteriaDelete. Также по вашему вопросу у вас появилось около 43000 идентификаторов и исключение, когда управление достигло 90000-й строки? это 9000-я строка, которую вы имеете в виду? –
Как можно закрыть ЭМП? часть блока finally и какое-то исключение было брошено? гадание - это все, что люди могут сделать здесь с этой информацией. –
Странно ли, что я прочитал название в голосе Дональда Трампа? – shmosel