我有一个具有最后修改属性的实体:
@Temporal(TemporalType.TIMESTAMP)
private Date lastModified;
@PreUpdate
@PrePersist
protected void onUpdate() {
lastModified = new Date();
}
和一个命名的jpql更新查询,它为旧实体设置一些属性:
update entity e set ... where e.lastModified < :threshold
然而,对于尚未修改的实体,即onUpdate()方法也会被调用,即如果出现以下情况:
entityManager.createQuery("...").executeUpdate();
返回零作为更新实体的数量。
我是否可以只更新旧实体而不触及最近的实体?阈值参数在更新的实体中是未知的,因此我无法将更新移动到onUpdate()方法中。原生查询可以帮助我吗?
答案 0 :(得分:2)
为什么不在lastModified字段上用@PreUpdate/@PrePersist
替换@Version
机制?这样,所有更新的实体都将具有字段集(并且只有更新的字段)。
如果我理解你的情况,它应该像你期望的那样完成工作。
答案 1 :(得分:1)
对不起,伙计们,我的junit测试是我的错。批量更新期间根本不调用onUpdate()(即使对于已修改的实体)。我被其他一些更新推迟到第一次选择时感到困惑。
在阅读了有关@Version的更多文档之后,我发现,我发现,批量更新(使用jpql)绕过实体管理器并发现,这同样适用于PreUpdate侦听器。因此问题不在我的更新代码中,而是在我的测试中。