CascadeType.REFRESH实际上是做什么的?

88

CascadeType.REFRESH实际上是做什么的?

它的定义是:

当我们刷新一个实体时,此字段中保存的所有实体也会被刷新

但这在实践中意味着什么?请给我一个简单的例子。

2个回答

130

单独的CascadeType描述有点令人困惑,但从一般情况可以轻松解决。

对于任何CascadeType值,这意味着如果在使用EntityManager接口调用操作X时,该实例引用了其他实体实例,并且该关联定义了CascadeType.X,则EntityManager操作也将应用于该关联实体。

因此,EntityManager.refresh()被定义为:

从数据库中刷新实例的状态,覆盖对实体所做的更改(如果有)。

因此,如果实体A引用实体B,并且该引用使用@CascadeType.REFRESH注释,并且调用EntityManager.refresh(A),则EntityManager.refresh(B)也会被隐式调用。


我知道这是一个旧帖子,但如果B的实例当前已分离,使用您上面提到的A和B的示例,CascadeType.PERSIST是否会导致B变为持久化状态?我正在使用Hibernate的JPA实现。 - Andy
5
回答了自己的问题。答案是否定的。你必须调用对象的“保存”函数才能使其变为持久化状态。 - Andy
如果我合并一个处于持久状态的对象会发生什么? - abhijeet pathak

10

通过刷新检索: 使用refresh方法可以从数据库中重新加载受管对象: 内存中的受管对象内容被丢弃(包括更改,如果有的话),并由从数据库检索到的数据替换。这可能有用,以确保应用程序处理最新版本的实体对象,以防它在检索后由另一个EntityManager进行了更改。

来源:http://www.objectdb.com/java/jpa/persistence/retrieve


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接