每个事务或批处理仅触发JPA回调一次
我正在按如下方式(在EJB中)批量删除行 调用此回调方法的次数与删除的行数相同。例如,如果删除10行,此方法将被调用10次 有没有办法在事务结束时只调用一次回调方法,即在执行此代码的EJB方法返回时调用一次,或者至少每批调用一次,即每个事务或批处理仅触发JPA回调一次,jpa,eclipselink,jpa-2.1,Jpa,Eclipselink,Jpa 2.1,我正在按如下方式(在EJB中)批量删除行 调用此回调方法的次数与删除的行数相同。例如,如果删除10行,此方法将被调用10次 有没有办法在事务结束时只调用一次回调方法,即在执行此代码的EJB方法返回时调用一次,或者至少每批调用一次,即entityManager.flush()时调用一次回调方法发生了什么?在这种情况下,首选前者 其他信息: 我正在使用WebSocket进行一些实时更新,当在一些数据库表上执行这样的CRUD操作时,会通知客户端。因此,每次删除一行时,向所有关联的客户端发送一条消息是
entityManager.flush()时调用一次回调方法代码>发生了什么?在这种情况下,首选前者
其他信息:
我正在使用WebSocket进行一些实时更新,当在一些数据库表上执行这样的CRUD操作时,会通知客户端。因此,每次删除一行时,向所有关联的客户端发送一条消息是毫无意义的,该消息是在批处理中执行的。而应该只在事务(或至少一批)结束时通知他们一次/一次(尽快)
以下JPA 2.1标准批量删除方法不起作用,因为它不直接对实体进行操作。这种方法不会触发JPA回调,也不会使用等价的JPQL
CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaDelete<Category> criteriaDelete = criteriaBuilder.createCriteriaDelete(Category.class);
Root<Category> root = criteriaDelete.from(entityManager.getMetamodel().entity(Category.class));
criteriaDelete.where(root.in(list));
entityManager.createQuery(criteriaDelete).executeUpdate();
CriteriaBuilder-CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaDelete-CriteriaDelete=criteriaBuilder.createCriteriaDelete(Category.class);
Root=criteriaDelete.from(entityManager.getMetamodel().entity(Category.class));
criteriaDelete.where(root.in(list));
entityManager.createQuery(criteriaDelete.executeUpdate();
我正在使用EclipseLink 2.5.2使JPA 2.1不幸的是,JPA提供了实体回调,需要为它们侦听的每个实体实例调用实体回调,因此,您需要添加自己的功能,以确保侦听器在每个批/事务等中仅触发一次。另一种选择是使用特定于提供程序的行为,在本例中,EclipseLink的会话事件侦听器:侦听PostCalculateUnitOfWorkChangeSet事件或需要时触发的其他事件。谢谢。是否有任何合理的例子可以让你对它们有一个基本的了解?谷歌并没有把我引向他们。
@ApplicationScoped
public class CategoryListener {
@PostPersist
@PostUpdate
@PostRemove
public void onChange(Category category) {
//...
}
}
CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaDelete<Category> criteriaDelete = criteriaBuilder.createCriteriaDelete(Category.class);
Root<Category> root = criteriaDelete.from(entityManager.getMetamodel().entity(Category.class));
criteriaDelete.where(root.in(list));
entityManager.createQuery(criteriaDelete).executeUpdate();