1

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

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

4

2 回答 2

2

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

如果我能很好地理解你的情况,它应该能如你所愿地完成这项工作。

于 2013-05-21T11:57:32.770 回答
1

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

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

于 2013-05-21T12:57:34.817 回答