为什么要使用FetchType.LAZY
withFetchMode.JOIN
而不是FetchType.EAGER
?. FetchType.LAZY
withFetchMode.JOIN
等于 Eager 模式。这样对吗?。为什么 putFetchmode.join
意味着如果发生任何延迟初始化异常,那么我们可以添加fetchmode=join
?。为什么不能直接使用fetchtype.Eager
。那么使用 fetchtype 和 有什么好处fetchmode.join()
吗?
4 回答
对于小型结果集数据模型, FetchType.EAGER不会对FetchMode.JOIN的延迟和内存占用产生很大影响。
对于需要根据技术和环境因素获得最佳效率的大容量数据集模型,FetchType.LAZY更可取,因为连接表指针保持不变 - 但实际结果集按需保存。
例如:与数据集键热连接的房屋对象与与电话号码对象热连接的区号对象在效率和资源利用率方面存在累积差异。
在必要时:
- 使用FetchType.EAGER进行小型结果集连接。
- 并将FetchType.LAZY用于大型结果集连接,其中效率被认为是必不可少的。
FetchType 更适合用在实体注解中。大多数时候我会建议你使用lazy
负载。
在这种情况下,如果您需要阻止,您可以通过使用LazyIntializationException
来临时请求要加载的条件。eager
FetchMode.JOIN
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.JOIN)
.setFetchMode("kittens", FetchMode.JOIN)
.list();
在集合或单值关联映射上使用 fetch="join",您实际上将避免第二个 SELECT(因此使关联或集合非惰性)
引用自
https://developer.jboss.org/wiki/AShortPrimerOnFetchingStrategies
考虑一个有薪水睡眠列表(一个连接)的员工类。1 位员工说有超过 100 个薪水睡眠。
您想要拥有所有员工的列表(例如 1000)。假设我们只想显示员工信息(No Salary Sleeps)。但是当我们使用 Eager 模式加载它时,即使所有工资都加载了所有员工。这是内存开销。