在select上触发@PreUpdate

时间:2013-09-24 09:12:04

标签: jpa playframework-2.0 stack-overflow

我有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方法?代码有问题吗?感谢。

编辑: 我读了this帖子,所以调用了em.flush()。但是没有UPDATE,INSERT调用。

1 个答案:

答案 0 :(得分:1)

我建议不要在JPA-listener回调中与JPA进行交互。根据我的经验,这是一条有许多令人讨厌和意外行为的道路(以及大量的调试时间)。