Hibernate EAGER fetch 和 cascade-type all 有啥区别

Posted

技术标签:

【中文标题】Hibernate EAGER fetch 和 cascade-type all 有啥区别【英文标题】:What is difference between Hibernate EAGER fetch and cascade-type allHibernate EAGER fetch 和 cascade-type all 有什么区别 【发布时间】:2015-07-22 19:22:55 【问题描述】:

请解释一下hibernate Eager fetching和cascade-type all的区别。

在这两种配置中我们都可以加载与其父对象关联的子对象,那么它们之间有什么区别。

【问题讨论】:

Difference between FetchType LAZY and EAGER in Java persistence?的可能重复 【参考方案1】:

Cascading 和 fetching 是正交关注点。

    级联是关于将 entity state transition 从 Parent 实体传播到 Child,通过允许 ORM 工具代表外部持久/合并/删除相关关联来简化数据访问代码。

    EAGER 获取是映射时关联加载决策,因为它指示 Hibernate 在加载根实体时始终检索依赖的关联。查询时获取是首选,因为它为您提供了更好的灵活性,而 LAZY 获取映射策略可以被 FETCH 指令覆盖。使用EAGER 获取时,您会卡住,因为您无法在查询时覆盖它,并且 Hibernate 将始终获取关联,即使在某些用例中您不需要它。

【讨论】:

好的..但是当我们说 cascadetype all 时,在选择查询的情况下,它会以类似的方式加载所有关联的实体,我们可以检索所有关联的对象类..然后我们在什么条件下使用它们 仔细阅读答案。我已经回答了你的评论问题【参考方案2】:

它很简单:考虑两个实体 1. 部门和 2. 员工,它们有一对多的映射。也就是说,一个部门可以有很多员工 cascade=CascadeType.ALL,它本质上意味着 DepartmentEntity 上发生的任何更改也必须级联到 EmployeeEntity。如果您保存一个 Department ,那么所有关联的 Employee 也将被保存到数据库中。如果您删除一个部门,则与该部门关联的所有员工也将被删除。级联类型都是 PERSIST、REMOVE、MERGE 和 REFRESH 级联类型的组合。 Example for Cascade type All Fetch 类型 Eager 本质上与 Lazy.Lazy 相反,Lazy.Lazy 是所有 Hibernate 注释关系的默认获取类型。当您使用 Lazy fetch 类型时,Hibernate 不会加载该特定对象实例的关系。 Eager 默认会加载与 Hibernate 加载的特定对象相关的所有关系。Click here for an example.

【讨论】:

以上是关于Hibernate EAGER fetch 和 cascade-type all 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

[Hibernate] - EAGER and LAZY

使用 JPA 在 Hibernate 中使用 EAGER 类型进行多次提取

Hibernate 返回设置为 EAGER 的对象的代理

JPA 2.1 Eager Fetch 属性

学说中 fetch="EAGER" 和 fetch="LAZY" 有啥区别

hibernate的反向生成改懒加载的地方