我有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调用。
答案 0 :(得分:1)
我建议不要在JPA-listener回调中与JPA进行交互。根据我的经验,这是一条有许多令人讨厌和意外行为的道路(以及大量的调试时间)。