1

我有带有preUpdate()方法的模型类,它用@PreUpdate 注释。此方法调用我的方法deleteCache()

public void deleteCache() {
    final List<Model> models = Model.findAll();
    for (final Model model : models) {
        Cache.remove(model.id);
    }
}

我的Model.findAll()实现:

public static List<Model> findAll() {
    Query query = JPA.em().createQuery("SELECT o FROM Model o");
    return query.getResultList();
}

当我触发 Model.save() 时,我的 preUpdate 方法被调用,它调用 deleteCache,但是当return query.getResultList()到达时 preUpdate 方法被再次调用,所以我得到了 StackoverflowException。

谁能向我解释为什么即使模型没有更改也会调用 preUpdate 方法?代码有问题吗?谢谢。

编辑:我读了这篇文章,所以 em.flush() 被调用。但是没有 UPDATE、INSERT 调用。

4

1 回答 1

1

我建议不要在 JPA 侦听器回调中与 JPA 交互。以我的经验,这是一条有很多令人讨厌和意想不到的行为(以及大量的调试时间)的道路。

于 2013-09-27T12:16:06.390 回答