【问题标题】:Hibernate.initialize fails with org.hibernate.HibernateException: collection is not associated with any sessionHibernate.initialize 失败并出现 org.hibernate.HibernateException:集合未与任何会话关联
【发布时间】:2014-08-27 07:28:09
【问题描述】:

A 有两个休眠实体和一个简单的 1:N 集合关系:

@Entity
public class Root {
    @OneToMany(mappedBy = "root", fetch = FetchType.LAZY)
    public Set<Position> getPositions() {
        return positions;
    }
}

Spring MVC web 应用程序加载根实体并初始化惰性集合:

@Transactional
public Root findFullById(Long id) {
    Root root = (Root) getSession().get(Root.class, id);
    Hibernate.initialize(root.getPositions()); // this line fails
    return root;
}

在此方法之前有NO个数据库操作。

这适用于我的 Oracle 11 DB 中的几乎所有实体,但有些(似乎是随机的)因“org.hibernate.HibernateException:集合不与任何会话相关联”而失败。据我了解,这是因为 PersistentSet 中的会话已关闭,但为什么它首先关闭?

最奇怪的是,如果我在这一行设置断点并在调试器中(即在 eclipse Inspect 窗口中)调用 Hibernate.initialize(),它会成功加载集合。

什么可以关闭会话?有什么好的地方可以调试这个(即休眠中某处的断点)?

更新:

我在 Position 类中有另一个关系:

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "POSITION_NUMBER", referencedColumnName = "POSITION_NUMBER", insertable = false, updatable = false)
public Set<Child> getChildren() {
    return children;
}

失败的行为空,但将其更改为 @Transient 可以解决问题。

【问题讨论】:

  • 你是如何处理 Hibernate 会话打开和关闭的?
  • 使用 tx:annotation-driven 和 org.springframework.orm.hibernate3.HibernateTransactionManager
  • 在 OpenSessionInView 过滤器中获得战利品

标签: java spring hibernate


【解决方案1】:

您可能需要使用处理会话打开和关闭的 OpenSessionInViewFilter。您没有指定 Spring / Hibernate 版本,因此可能需要进行调整。

web.xml 过滤器定义:

<filter>    
    <filter-name>hibernateFilter</filter-name>
      <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
      <init-param>
         <param-name>sessionFactoryBeanName</param-name>
         <param-value>sessionFactory</param-value>         
      </init-param>      
   </filter>

   <filter-mapping>
     <filter-name>hibernateFilter</filter-name>
   <url-pattern>
</filter>

【讨论】:

    【解决方案2】:

    我的问题中没有足够的数据来找到正确的答案。对此感到抱歉。

    所以与社区分享我的经验:问题是第二个键(POSITION_NUMBER)在第一个集合中不是唯一的,所以休眠加载了这个集合两次,第二次初始化失败。不知道是什么让它在调试器中正常,但修复数据解决了问题。

    所以我真正缺少的是键列上的唯一约束。

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 2013-09-28
      • 2012-06-11
      • 1970-01-01
      • 2011-03-06
      • 2017-12-03
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      相关资源
      最近更新 更多