2

我知道JPA规范要求如果将分离的实体传递给entityManager.refresh()then anIllegalArgumentException将被抛出,但我不明白为什么?refresh 方法的含义是忽略所做的任何更改,并从数据库中给我一个全新的副本。

4

2 回答 2

0

据我了解,这样做的目的在于实际使用refresh方法。

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

如果您忽略了分离的实体,那么使用的目的refresh就变得不必要了。为什么使用 查找新实体并不容易find

于 2013-11-15T19:38:22.947 回答
-1

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

编辑

你是对的,我首先没有理解你的问题。要回答您的问题,请参阅我引用的 JSR-317 JPA 规范:

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

用我的话来说,实体管理器看不到一个分离的实体,因此,实体管理器在传递一个分离的实体时将其视为“非法参数”是有道理的

为了证实我的论点,请查看这个总结了 JPA 实体生命周期的插图。它清楚地表明 refresh() 方法仅适用于 MANAGED 实体状态。

JPA 实体生命周期

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

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

这是我的第一个答案。

于 2013-11-17T04:43:33.463 回答