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

Java 遍历树:Hibernate LazyFetch dto.getObjects()vs Hibernate.initialize(dto.getObjects),java,hibernate,Java,Hibernate,出于某种原因,当我在会话中使用dto.getObjects()时,它不会填充对象,但我必须使用Hibernate.initialize(dto.getObjects) 有人能给我解释一下原因吗 附带的问题是,在hibernate中遍历树的最佳方法是什么,因为hibernate没有分层查询。有些树有200个节点和4个级别 我需要根据它的值和一个外部变量对树中的每个节点执行一系列更新 例如: node.setB(node.getA() + abc); 有什么评论吗?我更感兴趣的是知道为什么,而不是

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

有人能给我解释一下原因吗

附带的问题是,在hibernate中遍历树的最佳方法是什么,因为hibernate没有分层查询。有些树有200个节点和4个级别

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

例如:

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

有什么评论吗?我更感兴趣的是知道为什么,而不是如何。你应该把这个问题分成两个问题,以获得最好的答案。关于dto.getObjects()代理初始化:仅仅调用getter是不够的,您需要调用集合上的一个访问器或mutator方法来让Hibernate初始化代理

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

  • 实体配置(XML与注释)
  • 查询模式(条件、HQL或调用load()/get())
  • 最好是一个简短的查询代码示例

您应该将此问题分为两个问题,以获得最佳答案。关于dto.getObjects()代理初始化:仅仅调用getter是不够的,您需要调用集合上的一个访问器或mutator方法来让Hibernate初始化代理

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

  • 实体配置(XML与注释)
  • 查询模式(条件、HQL或调用load()/get())
  • 最好是一个简短的查询代码示例

我确实给访问者打了电话。我有一个变量private List children,我调用了parent.getChildren()@seesee:您需要调用返回集合的方法:
parent.getChildren().size()
parent.getChildren()
只返回未初始化的惰性集合。当您调用集合上的方法时,集合会自动初始化。代理也是一样。@JB nize有没有网站可以让我读到这一点,因为我看到很多使用parent.getChildren()而没有Hibernate.Initialize()或.size()的发布示例大多数教程都不使用分离的对象。会话打开时,用户可以操作实体。因此不需要Hibernate.initialize()。阅读Hibernate.initialize()的javadoc和官方Hibernate文档?在我做了一个.getChildren()之后,我首先在那里做一个get(id)。。如果我没有弄错,对象仍处于连接状态,会话处于打开状态。我如何测试?我确实读过。。。这就是我问这个问题的原因。我不明白为什么我必须使用Hibernate.initialize()。不是关于答案,但我正在努力理解这个过程(为什么)。我确实给访问者打了电话。我有一个变量private List children,我调用了parent.getChildren()@seesee:您需要调用返回集合的方法:
parent.getChildren().size()
parent.getChildren()
只返回未初始化的惰性集合。当您调用集合上的方法时,集合会自动初始化。代理也是一样。@JB nize有没有网站可以让我读到这一点,因为我看到很多使用parent.getChildren()而没有Hibernate.Initialize()或.size()的发布示例大多数教程都不使用分离的对象。会话打开时,用户可以操作实体。因此不需要Hibernate.initialize()。阅读Hibernate.initialize()的javadoc和官方Hibernate文档?在我做了一个.getChildren()之后,我首先在那里做一个get(id)。。如果我没有弄错,对象仍处于连接状态,会话处于打开状态。我如何测试?我确实读过。。。这就是我问这个问题的原因。我不明白为什么我必须使用Hibernate.initialize()。这与答案无关,但我正试图理解这个过程(为什么)。