CascadeType 与 FetchType

Posted

技术标签:

【中文标题】CascadeType 与 FetchType【英文标题】:CascadeType vs FetchType 【发布时间】:2015-09-27 21:43:47 【问题描述】:

我现在想问一下 Hibernate 中 CascadeType 和 FetchType 有什么区别?

它们看起来非常相似,但我想它们不能互换,对吧? 什么时候使用它们?可以同时使用吗?

【问题讨论】:

我的回答对你有帮助吗?如果是,请接受/投票。 @jarosik 如果是,请接受/投票。 两者有很大不同。有关 FetchType,请参阅第 89 页。对于级联,请参阅第 3.2 节(第 80 页)download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/… 【参考方案1】:

这是两个不同的东西:

Hib 中的CascadeType。可能是REFRESH, MERGE, ..., ALL 你把它放在相关实体下,它决定了相关实体的行为,如果当前实体是:刷新、更新、删除等。因此,每当您的实体受到影响时,CascadeType 就会告诉相关实体是否也应该受到影响。

FetchType 只能是 2 个:EAGERLAZY。您也可以将这个放在相关实体下,它决定了在当前实体初始化时是否应该立即初始化相关实体 (EAGER) 或仅按需进行 > (LAZY)。

【讨论】:

具体来说,这不仅适用于 Hibernate,而且通常适用于 JPA(根据 JSR338)。文档:download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/…【参考方案2】:

两者是不同的配置,你可以用简单的SQL来关联。

Cascade 告诉你当一个实体被更新时会发生什么(在 sql 中删除级联)

Fetch 告诉查询将如何被执行(join、lazy ...)

【讨论】:

【参考方案3】:

这两者有很大的不同。

CascadeType 是一个属性,用于定义父子关系中的级联。 FetchType 是一个用于定义抓取策略的属性,用于优化 Hibernate 生成的 select 语句,使其 可以尽可能高效。

您可以在以下位置找到更多关于它们的信息:

    Hibernate – fetching strategies examples Hibernate JPA Cascade Types

【讨论】:

【参考方案4】:

Cascading 用于将entity state transitions 从父实体传播到子实体。

Fetching 用于加载关联实体,您可以:

全局提取策略(通过实体映射定义) 查询时获取策略(使用 HQL/JPQL FETCH 指令)

【讨论】:

以上是关于CascadeType 与 FetchType的主要内容,如果未能解决你的问题,请参考以下文章

hibernate CascadeType属性

不同用例的不同 CascadeType 值

使用 cascade=CascadeType.TYPE_NAME 的目的是啥

以编程方式使所有关系CascadeType.MERGE

一对多关系中的 CascadeType 问题

hibernate注解的CascadeType属性