我正在使用带有 mysql 和 hibernate 4 和 c3p0 的球衣。我创建了一个初始化 servlet,它配置休眠并将当前会话上下文类设置为线程。我创建了 hibernateUtils 类,其中包含用于获取和提交会话的静态方法,并且我正在使用过滤器在入站请求上启动会话并在响应时提交它。
问题是,在某些随机时间间隔,我得到 org.hibernate.TransactionException: nested transactions not supported 异常,但我没有尝试在过滤器上创建新会话。
如果我错了,请纠正我,但是在将当前会话类设置为线程时,我不需要在 hibernateutil 中创建 threadlocal,hibernate 会这样做。所以我的问题是,这是一种安全的处理方法吗?什么可能导致随机间隔发生错误?
====================== 编辑 ===========================
很抱歉没有早点发布代码。所以过滤器实现了ContainerRequestFilter,ContainerResponseFilter
在我正在做的请求过滤器中
Session session = sessionfactory.getCurrentSession();
session.getTransaction().begin();
session.setDefaultReadOnly(readOnly);
并在回应中
Transaction transaction = sessionfactory.getCurrentSession().getTransaction();
try {
if (transaction != null && !transaction.wasCommitted()
&& !transaction.wasRolledBack() && transaction.isActive()) {
transaction.commit();
}
} catch (HibernateException e) {
Transaction transaction = sessionfactory.getCurrentSession().getTransaction();
try {
if (transaction != null && transaction.isActive()) {
transaction.rollback();
}
} catch (HibernateException e) {
} finally {
Session session = sessionfactory.getCurrentSession();
try {
if (session != null && session.isOpen()) {
session.close();
}
} catch (HibernateException e) {
log.error("Closing session after rollback error: ", e);
throw e;
}
}