我正在使用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()
函数返回新的会话对象或现有对象。在这种情况下,它在哪里获得现有的会话对象?如果它创建了一个新的会话对象,那么处理所涉及的集合仍然没问题吗?
非常感谢任何帮助。提前致谢!更多功率堆栈溢出。
答案 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个会话。