我正在使用JPA /休眠。

我正在批量更新:


代码段:

@PersistenceContext
private EntityManage entityManager;

   ...
private int update(StudentEntity studentEntity){
 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
 CriteriaUpdate<StudentEntity > criteria = builder.createCriteriaUpdate(StudentEntity.class);
 Root<StudentEntity> root = criteria.form(StudentEntity.class)
 setFields(criteria, root, studentEntity)
 criteria.where(builder.equal(root.get("studentId"), studentEntity.getStudentId()));
 return entityManager.createQuery(criteria).executeUpdate();
}

private setFields(CriteriaUpdate<StudentEntity> criteria,  Root<StudentEntity> root,StudentEntity  studentEntity){
 criteria.set(root.get("studentName"),studentEntity.getStudentName());

 ....
}




执行上述代码@PostUpdate钩子时未调用,为什么?

@PostUpdate
private update (StudentEntity studentEntity){
  System.out.println("@PostUpdate called.");
}

最佳答案

根据JPA规范(第3.5.3节):


PreUpdatePostUpdate回调分别发生在对实体数据进行数据库更新操作之前和之后。


即这些事件仅在使用实体生命周期加载实体,对其进行处理然后将状态刷新到数据库时才被触发。

10-06 06:01