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 个:EAGER
和 LAZY
。您也可以将这个放在相关实体下,它决定了在当前实体初始化时是否应该立即初始化相关实体 (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的主要内容,如果未能解决你的问题,请参考以下文章