CascadeType.REFRESH实际做什么?


81

什么是CascadeType.REFRESH真正做?

它的定义是

刷新实体时,此字段中保存的所有实体也会刷新

但这实际上意味着什么?有人可以给我一个简单的例子吗?

Answers:


117

单独的CascadeType描述可能会有些混乱,但是有一种简单的方法可以从一般情况中找出来。

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

因此EntityManager.refresh()定义为:

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

因此,如果实体A具有对实体B的引用,并且该引用用注释@CascadeType.REFRESH,并且EntityManager.refresh(A)被调用,那么EntityManager.refresh(B)也将隐式调用。


我知道这是一篇旧文章,但是使用您上面的A和B的示例,如果B的实例当前是分离的,CascadeType.PERSIST会导致B变得持久吗?我正在使用Hibernate的JPA实现。
安迪

4
回答了我自己的问题。答案是否定的。您必须在该对象上调用save才能使其持久化。
安迪

如果合并处于持久状态的对象会发生什么?
abhijeet pathak

9

通过刷新检索:可以使用刷新方法从数据库中重新加载托管对象:

内存中托管对象的内容将被丢弃(包括更改,如果有的话),并由从数据库中检索到的数据代替。这对于确保应用程序处理实体对象的最新版本可能很有用,以防万一自检索之日起它可能已被另一个EntityManager更改过。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.