我正在使用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节):
PreUpdate
和PostUpdate
回调分别发生在对实体数据进行数据库更新操作之前和之后。
即这些事件仅在使用实体生命周期加载实体,对其进行处理然后将状态刷新到数据库时才被触发。