【问题标题】:Why is collection initialized with proxies in hibernate?为什么在休眠中使用代理初始化集合?
【发布时间】:2013-06-24 13:50:45
【问题描述】:

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

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

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

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

package_name.Topic_$$_javassist_4
package_name.Topic

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

顺便说一句,hibernate 记录选择语句以选择我的主题实体并将值打印到控制台,它们都是我从集合中获得的两个主题的正确值

谢谢!

【问题讨论】:

    标签: hibernate collections many-to-many


    【解决方案1】:

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

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

    【讨论】:

    • 感谢回复!你是完全正确的,我在事务中加载了用户,然后我关闭了会话,然后我遍历了“主题”。
    • 我需要在事务中初始化集合!再次感谢!
    • Collection 确实有一个初始化和一个未初始化的 Topic。我通过以下方式初始化了每个主题实体: if (entity instanceof HibernateProxy) { entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation(); }
    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多