Jakarta ee EntityManager.refresh分离实体引发异常您认为是什么原因?

Jakarta ee EntityManager.refresh分离实体引发异常您认为是什么原因?,jakarta-ee,jpa-2.0,Jakarta Ee,Jpa 2.0,我知道JPA规范规定,如果将分离的实体传递给entityManager.refresh(),则应抛出IllegalArgumentException,但我不明白为什么?刷新方法的含义是忽略所做的任何更改并给出 给我一份DB的新副本 据我所知,此方法的目的在于实际使用refresh方法 在实体的读取和实际使用之间可能会发生数据库中的某些更改时,需要使用刷新。例如,在使用某个字段之前,您希望最小化数据的过时性。您可以调用refresh。EM从数据库中提取最新的更改 如果您想跳过分离的实体,那么使用刷

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

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

在实体的读取和实际使用之间可能会发生数据库中的某些更改时,需要使用刷新。例如,在使用某个字段之前,您希望最小化数据的过时性。您可以调用
refresh
。EM从数据库中提取最新的更改


如果您想跳过分离的实体,那么使用
刷新
的目的在某种程度上变得不必要了。为什么使用
find
查找新实体不容易?

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

在实体的读取和实际使用之间可能会发生数据库中的某些更改时,需要使用刷新。例如,在使用某个字段之前,您希望最小化数据的过时性。您可以调用
refresh
。EM从数据库中提取最新的更改


如果您想跳过分离的实体,那么使用
刷新
的目的在某种程度上变得不必要了。为什么使用
find
查找新实体不容易?

如果您的JPA2.0实现是EclipseLink,那么根据,您不需要担心刷新实体管理器。默认情况下,每次执行查询时都会刷新它

编辑 你说得对,我先不明白你的问题。要回答您的问题,请参考我引用的JSR-317 JPA规范:

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

用我的话说,分离的实体对实体管理器不可见,因此,当实体管理器传递分离的实体时,它将其视为“非法参数”,这是有道理的

为了证实我的论点,请查看JPA实体生命周期的摘要。它清楚地表明refresh()方法仅适用于托管实体状态

我希望你的下一个问题是: 托管实体何时需要与数据库刷新/同步


下面是我的第一个答案。

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

编辑 你说得对,我先不明白你的问题。要回答您的问题,请参考我引用的JSR-317 JPA规范:

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

用我的话说,分离的实体对实体管理器不可见,因此,当实体管理器传递分离的实体时,它将其视为“非法参数”,这是有道理的

为了证实我的论点,请查看JPA实体生命周期的摘要。它清楚地表明refresh()方法仅适用于托管实体状态

我希望你的下一个问题是: 托管实体何时需要与数据库刷新/同步


这是我要玩的第一个答案。

是的,我与您在线,我需要从DB获取最新的更改,因此传递分离的实体有什么问题?只需从数据库中获取此实体的最新版本,为什么要合并它?是的,我与您是内联的,我需要从数据库中获取最新更改,那么传递分离的实体有什么问题?只需从该实体的DB中获取最新版本,为什么我要合并它?与问题完全无关。我知道刷新实体必须对其进行管理,这就是我在问题中所说的(我理解JPA规范…),我的问题是规范为什么要求此要求!由于“refresh”方法用于重新加载实体并放弃更新,因此EntityManager不需要保证正在刷新的实体的状态,而是要求它从DB返回一个刷新的实体并放弃任何更改。根据定义,refresh()方法无法将分离的实体转换为托管实体。与问题完全无关。我知道刷新实体必须对其进行管理,这就是我在问题中所说的(我理解JPA规范…),我的问题是规范为什么要求此要求!由于“refresh”方法用于重新加载实体并放弃更新,因此EntityManager不需要保证正在刷新的实体的状态,而是要求从数据库中返回一个刷新的实体并放弃任何更改。根据定义,refresh()方法无法将分离的实体转换为托管实体。