0

我在用户和主题之间有非常简单的@ManyToMany 关系:

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

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

更新这似乎是不可能的,但它是!已经在活动事务中,我遍历我的“主题”集合并打印每个主题实体的类名:

package_name.Topic_$$_javassist_4
package_name.Topic

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

顺便说一句,休眠日志选择语句来选择我的主题实体和值被打印到控制台,它们都是我从集合中的两个主题的正确值

谢谢!

4

1 回答 1

1

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

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

于 2013-06-24T15:23:40.290 回答