Hibernate EAGER获取与级联类型ALL的区别是什么?

4
请解释Hibernate中Eager fetching和cascade-type all的区别。
在这两种配置中,我们都可以加载与其父对象相关联的子对象,那么它们之间的区别是什么?

2个回答

6

简单来说:考虑两个实体,1.部门和2.员工,它们之间存在一对多的映射关系。也就是说一个部门可以有很多员工。级联类型为CascadeType.ALL,这意味着DepartmentEntity上发生的任何更改都必须同步到EmployeeEntity中。如果您保存了一个Department,则所有相关的Employee也将保存到数据库中。如果您删除一个Department,则与该Department关联的所有Employee也将被删除。
Cascade-type all是PERSIST,REMOVE,MERGE和REFRESH级联类型的组合。级联类型all的示例

Eager获取类型本质上是Lazy的相反。Lazy是所有Hibernate注释关系的默认获取类型。当您使用Lazy获取类型时,Hibernate不会加载该特定对象实例的关系。Eager将默认加载Hibernate加载的特定对象相关的所有关系单击此处以查看示例。


4

级联获取是互不相关的问题。

  1. 级联是指从一个Parent实体向Child实体传播实体状态转换,通过允许ORM工具在我们的代表下持久化/合并/删除依赖关联来简化数据访问代码。

  2. EAGER获取是一种映射时间的关联加载决策,因为它指示Hibernate始终在加载根实体时检索依赖关联。查询时间获取更加灵活,虽然LAZY获取映射策略可以被FETCH指令覆盖。使用EAGER获取,您将受限制,因为您无法在查询时覆盖它,而Hibernate将始终获取关联,即使在某些用例中您不需要它。


1
好的,但是当我们使用cascadetype all时,在选择查询的情况下,它会加载所有相关实体,类似地,在急切获取中,我们可以检索所有相关的对象类。那么在什么情况下应该使用它们呢? - sagar narkhede
仔细阅读答案。我已经回答了你的评论问题。 - Vlad Mihalcea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接