JPA Criteria删除了巨大的参数

pir*_*ent 6 jpa criteria-api

我正在使用JPA 2.1,Oracle DB并且有一个要删除的实体的id列表(大约430000个ID).首先,它实现为将id列表拆分为每个较小的一个1000个ID,将它们作为JPQL的参数传递并执行.

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));
Run Code Online (Sandbox Code Playgroud)

它运行正常,直到它达到第90000个并且有一个运行时异常导致它停在这里

org.hibernate.SessionException:会话已关闭

并使实体经理工厂关闭.

信息:bernate.impl.StmpContainerEntityManagerFactoryBean:关闭持久性单元'IMOFFERINGMANAGEMENT'的JPA EntityManagerFactory

对于这个例外,我的第一篇文章误导了谁

java.lang.IllegalStateException:EntityManagerFactory已关闭

有一个catch子句通过在抛出数据库之前向数据库添加记录来处理运行时异常.并且要添加事件记录,它会尝试从工厂创建另一个实体管理器,该管理器现在已关闭.

public static void logEvent(EntityManager em) {
    EntityManager em2 = null;
    EntityManagerFactory emFactory = em.getEntityManagerFactory();
    em2 = emFactory.createEntityManager();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

任何人都能对此有所了解吗?

far*_*lmr 0

我不清楚您的代码,但您可能会遇到事务超时。您可以设置提示 -

query.setHint("javax.persistence.query.timeout", 8000);
Run Code Online (Sandbox Code Playgroud)

数据库端也可能存在超时的情况