一尘不染

Hibernate,要懒还是不懒?

hibernate

我有entity A,与有着多对多的关系entity B

因此表布局为: A, AB(mapping table), B

为了得到实体A的对象:我叫A.getById()其不getHibernateTemplate().get(A.class, id) 使用spring和hibernate。

问题是,有时后续代码仅需要A,有时后续代码将继续访问关联的B,因此我们希望在某些情况下使用 延迟加载, 在某些情况下则 渴望
使用。但是问题是所有数据库访问都是通过同一单一数据库提供的ADao.java,因此只有一种方法getById()

我应该创建方法getById()的两个版本吗?

但是对于更复杂的情况,如果A也通过多对多连接到C,则可能存在懒加载C和急切加载C的getById()变体,因此所需的变体迅速成倍增长。

您对此选择有何看法?

谢谢


阅读 213

收藏
2020-06-20

共1个答案

一尘不染

出于一般考虑,请参阅有关获取策略的Hibernate
3.6文档。默认的获取策略是在映射注释或hbm.xml文件中定义的。有三种方法可以从默认的延迟加载策略动态切换到优先加载策略。对于懒加载和急加载用例,前两个需要DAO方法的单独实现:

  1. Criteria.setFetchMode() 在hibernate条件查询中
  2. FETCH HQL查询中的关键字
  3. 从Hibernate 3.5(现在还不太确定,也许是3.6)开始,就有了第三个选择,即使用获取配置文件来动态地从延迟加载切换到渴望加载。

提取配置文件在会话范围内启用/禁用。因此,只要在当前会话中设置了所需的提取配置文件,就可以将相同的DAO方法用于延迟加载和快速加载用例。

在此需要注意的重要一点是,您 只能从 注释或hbm.xml文件中定义 的延迟加载策略切换 到渴望加载策略
,反之亦然。此限制与用于切换获取策略的方法无关。

2020-06-20