2012-05-07 17 views
1

我使用Hibernate和Spring和我得到在执行以下代码此异常关联:非法企图的集合,在Hibernate中两次公开会议

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 APIs说getSession()函数返回一个新的会话对象或现有的。在这种情况下,它从哪里获得现有会话对象?如果它创建一个新的会话对象,那么处理涉及的集合仍然可以吗?

任何帮助将不胜感激。提前致谢!更多的功率叠加。

+0

你已经省略了最重要的部分:getSession调用的实际背后是什么?你打电话给哪个对象?它看起来像你在一些框架内写这个代码。 Hibernate自己的方法是'SessionFactory.getCurrentSession'。 –

+0

@MarkoTopolnik - getSession()调用来自Spring框架的HibernateDAOSupport。看起来类已经扩展了,并且使用了该函数。对于缺乏信息抱歉。 – Oneb

回答

0

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

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

4

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

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

谢谢。我会试试这个,如果有效的话会给予反馈。 – Oneb

相关问题