我理解JPA
规范要求如果将一个分离的实体传递给entityManager.refresh()
,那么将抛出一个IllegalArgumentException
,但我不明白为什么?刷新方法的含义是忽略所做的任何更改并给出
我是DB的新副本。
答案 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实体状态。
何时需要刷新/与数据库同步 ?
这是我的第一个回答。