在您看来,EntityManager.refresh分离实体会抛出异常原因吗?

时间:2013-11-15 08:09:08

标签: java-ee jpa-2.0

我理解JPA规范要求如果将一个分离的实体传递给entityManager.refresh(),那么将抛出一个IllegalArgumentException,但我不明白为什么?刷新方法的含义是忽略所做的任何更改并给出 我是DB的新副本。

2 个答案:

答案 0 :(得分:0)

据我所知,目的在于实际使用refresh方法。

在实体读取和实际使用之间需要使用刷新可能会发生db中的某些更改。例如,在使用某个字段之前,您希望最大限度地减少数据的过时。你打电话给refresh。 EM从DB中提取最新的更改。

如果你要通过分离的实体,使用refresh的目的变得不知所措。为什么使用find查找新实体并不容易?

答案 1 :(得分:-1)

如果您的JPA 2.0实现是EclipseLink,那么根据this documentation,您无需担心刷新实体管理器。默认情况下,每次执行查询时都会为您刷新。

修改

你是对的我先不明白你的问题。要回答您的问题,请参阅我引用的JSR-317 JPA规范:

  

分离的实体实例继续存在于持久化或检索它们的持久性上下文之外。它们的状态不再保证与数据库状态同步。

在我看来,实体管理器看不到一个分离的实体,因此,实体管理器在传递一个分离的实体时会认为它是“非法的参数”

要确认我的论点,请查看this illustration,其中总结了JPA实体生命周期。它清楚地表明refresh()方法仅适用于MANAGED实体状态。

JPA entity lifecycle

我希望你的下一个问题是:

何时需要刷新/与数据库同步

这是我的第一个回答。