遍历树:Hibernate LazyFetch dto.getObjects()vs Hibernate.initialize(dto.getObjects)

时间:2012-07-24 23:22:34

标签: java hibernate

出于某种原因,当我在会话中使用dto.getObjects()时,它不会填充对象,但我必须使用Hibernate.initialize(dto.getObjects)

有人可以向我解释原因吗?

附带问题,在休眠状态下遍历树的最佳方法是什么,没有分层查询。有些树有200个节点和4个层次。

我需要根据它的值和外部变量对树中的每个节点执行一系列更新。

示例:

node.setB(node.getA() + abc);

任何评论?我更想知道原因而不是如何。

1 个答案:

答案 0 :(得分:1)

你应该把它分成两个问题,以便找到答案的最佳机会。关于dto.getObjects()代理初始化:仅仅调用getter是不够的,你需要调用集合中的一个accessor或mutator方法让Hibernate初始化代理。

这里的问题是,当您查询父对象时,Hibernate介入并用代理对象替换子集合,而不是执行查询以获取您可能需要或可能不需要的信息。当您调用一个方法(如代理集合上的size())时,Hibernate知道您希望实际使用该集合,因此它会耗尽到DB并获取数据。如果您想要急切地获取集合,则需要配置关系来执行此操作。有几种方法可以做到这一点,我们需要以下有关您的设置的信息,以便最好地帮助您:

  • 实体配置(XML与注释)
  • 查询模式(Criteria,HQL或调用load()/ get())
  • 最好是您如何查询的简短代码示例
相关问题