为什么在hibernate中使用代理初始化集合?

时间:2013-06-24 13:50:46

标签: hibernate collections many-to-many

我在User和Topic之间有非常简单的@ManyToMany关系:

@ManyToMany(mappedBy = "users", fetch = FetchType.LAZY)
public Set<Topic> getTopics() {
    return topics;
}

当我通过Iterator遍历此集合时,返回的每个元素都是Topic实体的代理。 它的类名是:Topic_javassist_4。 但正如我所知,集合应该用具体类型的元素初始化(在我的例子中是“主题”)。 为什么集合'主题'充满了代理?

更新这似乎不可能,但确实如此!已经在活动事务中,我遍历我的'topics'集合并打印每个Topic实体的类名:

package_name.Topic_$$_javassist_4
package_name.Topic

为什么在同一个集合中第一个主题未初始化,第二个主题是?

BTW,hibernate记录选择语句以选择我的主题实体,并将值打印到控制台,它们都是我收集的两个主题的正确值

谢谢!

1 个答案:

答案 0 :(得分:1)

您已将您与Topic的关系声明为LAZY。这意味着,每当提取用户时,除非确实需要,否则不会提取相关主题。代理是实现这一目标的机制。

您是在事务边界内遍历您的集合,还是在您迭代主题时交易已经关闭?您似乎已经加载了您的用户,关闭了连接,然后开始迭代您的主题?