在空更新期间触发的PreUpdate侦听器

时间:2013-05-21 09:29:48

标签: java jpa sql-update jpql

我有一个具有最后修改属性的实体:

@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()方法中。原生查询可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

为什么不在lastModified字段上用@PreUpdate/@PrePersist替换@Version机制?这样,所有更新的实体都将具有字段集(并且只有更新的字段)。

如果我理解你的情况,它应该像你期望的那样完成工作。

答案 1 :(得分:1)

对不起,伙计们,我的junit测试是我的错。批量更新期间根本不调用onUpdate()(即使对于已修改的实体)。我被其他一些更新推迟到第一次选择时感到困惑。

在阅读了有关@Version的更多文档之后,我发现,我发现,批量更新(使用jpql)绕过实体管理器并发现,这同样适用于PreUpdate侦听器。因此问题不在我的更新代码中,而是在我的测试中。