1

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

任何帮助将不胜感激。提前致谢!更多的权力堆栈溢出。

4

2 回答 2

4

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

 try
 {
     getHibernateTemplate().delete(oProject);
     bResult = true;
 }
 catch (Exception e)
 {
     bResult = false;
     logger.error(e);
 }
于 2012-05-07T10:20:39.480 回答
0

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

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

于 2012-05-07T10:17:48.597 回答