【问题标题】:What does CascadeType.REFRESH actually do?CascadeType.REFRESH 实际上做了什么?
【发布时间】:2010-11-27 01:59:41
【问题描述】:

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

它的定义是

当我们刷新一个实体时,该字段中的所有实体也会刷新

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

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    单独的 CascadeType 描述可能有点令人困惑,但有一种简单的方法可以从一般情况中找出答案。

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

    所以EntityManager.refresh() 定义为:

    刷新实例的状态 数据库,覆盖所做的更改 到实体,如果有的话。

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

    【讨论】:

    • 我知道这是一篇旧帖子,但使用上面的 A 和 B 示例,如果 B 的实例当前已分离,CascadeType.PERSIST 会导致 B 变得持久吗?我正在使用 Hibernate 的 JPA 实现。
    • 回答了我自己的问题。答案是否定的。您必须在对象上调用 save 才能使其持久化。
    • 如果我合并一个处于持久状态的对象会发生什么?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2020-11-21
      • 2015-02-26
      • 2017-06-29
      • 2013-06-13
      • 2021-10-25
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多