非法尝试将集合与hibernate中的两个打开会话相关联

时间:2012-05-07 10:14:58

标签: java spring hibernate

我正在使用hibernate和spring,我在执行以下代码时遇到此异常:

Session oSession = getSession();
     try
     {
         oSession.setFlushMode(FlushMode.COMMIT);
         getHibernateTemplate().delete(oProject);
         oSession.flush();
         bResult = true;
     }
     catch (Exception e)
     {
         bResult = false;
         logger.error(e);
     }

我已经阅读了一些关于hibernate的会话管理,我预感到这段代码的会话处理很差。有两次公开会议的原因是什么? Hibernate API表示getSession()函数返回新的会话对象或现有对象。在这种情况下,它在哪里获得现有的会话对象?如果它创建了一个新的会话对象,那么处理所涉及的集合仍然没问题吗?

非常感谢任何帮助。提前致谢!更多功率堆栈溢出。

2 个答案:

答案 0 :(得分:4)

HibernateTemplate.delete(Object entity)将使用HibernateTemplate内的其他Session删除对象,但您自己打开一个新的Session对象,这是错误的根本原因。所以你应该尝试如下:

 try
 {
     getHibernateTemplate().delete(oProject);
     bResult = true;
 }
 catch (Exception e)
 {
     bResult = false;
     logger.error(e);
 }

答案 1 :(得分:0)

Hibernate检查是否已为当前线程打开了一个会话。如果没有,它会使用SessionFactory创建一个新的;否则它会重用已经打开的会话。那么你可以重新附加实体对象,对于包含实体对象的集合也是如此。

但是你还没有提到如何配置Hibernate来处理会话。可能是您手动打开会话,而您发布的代码实际上会打开2个会话。