冬眠,懒惰还是不懒惰?

ted*_*ddy 5 design-patterns hibernate lazy-evaluation

我有entity A,它有多对多的关系entity B.

所以表格布局是: A, AB(mapping table), B

获取实体A的对象:我调用A.getById()哪个getHibernateTemplate().get(A.class, id) 使用spring和hibernate.

问题是,有时随之而来的代码将只需要一个,有时随后的代码将继续访问相关的B的,所以我们想使用延迟加载在某些情况下,并渴望在其他一些情况下.但问题是所有数据库访问都是通过同一个单独提供的ADao.java,因此只有一种方法getById().

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

但是对于更复杂的情况,如果A也通过多对多连接到C,那么可能存在lazy-loading-C和eager-loading-C的getById()变体,因此所需的变体快速呈指数增长.

你对这个选择有什么看法?

谢谢

tsc*_*cho 3

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

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

在会话范围内启用/禁用获取配置文件。因此,只要在当前会话中设置了所需的获取配置文件,您就可以使用相同的 DAO 方法进行延迟加载以及急切加载用例。

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