Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每个事务或批处理仅触发JPA回调一次_Jpa_Eclipselink_Jpa 2.1 - Fatal编程技术网

每个事务或批处理仅触发JPA回调一次

每个事务或批处理仅触发JPA回调一次,jpa,eclipselink,jpa-2.1,Jpa,Eclipselink,Jpa 2.1,我正在按如下方式(在EJB中)批量删除行 调用此回调方法的次数与删除的行数相同。例如,如果删除10行,此方法将被调用10次 有没有办法在事务结束时只调用一次回调方法,即在执行此代码的EJB方法返回时调用一次,或者至少每批调用一次,即entityManager.flush()时调用一次回调方法发生了什么?在这种情况下,首选前者 其他信息: 我正在使用WebSocket进行一些实时更新,当在一些数据库表上执行这样的CRUD操作时,会通知客户端。因此,每次删除一行时,向所有关联的客户端发送一条消息是

我正在按如下方式(在EJB中)批量删除行

调用此回调方法的次数与删除的行数相同。例如,如果删除10行,此方法将被调用10次

有没有办法在事务结束时只调用一次回调方法,即在执行此代码的EJB方法返回时调用一次,或者至少每批调用一次,即
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();