【发布时间】:2015-07-22 19:22:55
【问题描述】:
请解释一下hibernate Eager fetching和cascade-type all的区别。
在这两种配置中我们都可以加载与其父对象关联的子对象,那么它们之间有什么区别。
【问题讨论】:
标签: java hibernate jpa orm fetch
请解释一下hibernate Eager fetching和cascade-type all的区别。
在这两种配置中我们都可以加载与其父对象关联的子对象,那么它们之间有什么区别。
【问题讨论】:
标签: java hibernate jpa orm fetch
级联是关于将 entity state transition 从 Parent 实体传播到 Child,通过允许 ORM 工具代表外部持久/合并/删除相关关联来简化数据访问代码。
EAGER 获取是映射时关联加载决策,因为它指示 Hibernate 在加载根实体时始终检索依赖的关联。查询时获取是首选,因为它为您提供了更好的灵活性,而 LAZY 获取映射策略可以被 FETCH 指令覆盖。使用EAGER 获取时,您会卡住,因为您无法在查询时覆盖它,并且 Hibernate 将始终获取关联,即使在某些用例中您不需要它。
【讨论】:
它很简单:考虑两个实体 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.
【讨论】: