Hibernate - 如何有效地获取大对象图?

时间:2011-08-01 14:58:44

标签: hibernate

对于项目,我必须从数据库中读取对象列表。对象类型是由大量关联对象组成的大对象图。当我执行select查询以获取数据库中所有对象的列表时,Hibernate不仅执行1个,而且执行45个额外查询。但是,似乎对象是延迟加载的。

但我需要的是有效加载WHOLE对象的列表。最好的方法是什么?

我首先想到的是使用fetch join,但是有这么多关联,这可能会成为一个真正的痛苦。有没有更好的解决方案?

1 个答案:

答案 0 :(得分:3)

获取联接和缓存(或其组合)基本上是提高性能的唯一方法;它们是否适合您,在很大程度上取决于您的实体是什么样的,以及您正在尝试做什么。

缓存对于(有些)有限数量(理想情况下不可变的)实例的多对一依赖性是有帮助的 - 例如查找参考文献。获取连接可用于所有其他一对一和多对一;尝试获取嵌套集合很快就会失控非常

在某些情况下适用的另一个技巧是在运行查询之前预先加载(某些)延迟相关实体(如果您事先知道它们是什么)到会话中。这样,在不切实际的情况下,您不必处理二级缓存的性能/内存问题。

所有这一切,如果您提到的45个额外查询在列表中每个实体,您可能不得不在某处进行权衡并缓存/获取一些依赖关系,让其他人通过后续选择加载。