我正在开发一个Web应用程序。通常在请求开始时(通过体系结构代码),打开Hibernate会话以处理数据库事务。在请求结束时,会话将关闭。这适用于我们的所有事务,除了在一个特定实例中,我想从请求中触发一个线程。该线程将调用DB事务。
从线程中,我调用“sessionFactory.openSession()”,并在此会话中执行我的事务。问题出现在请求完成时,线程本身可能不一定完成。因此,当请求完成并且线程尝试执行另一个DB事务时,我得到一个Hibernate会话已关闭!错误。
无论如何,从我的帖子中,我可以打开一个“干净”的会话,与请求开始时打开的会话无关?
答案 0 :(得分:1)
您可以创建一个扩展HibernateAccessor
的线程服务,作为spring.xml
定义的独立Spring服务,并向其发送您要处理的代码/数据。像这样:
Session session = SessionFactoryUtils.getSession(
getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator());
SessionHolder sessionHolder = null;
try {
applyFlushMode(session, false);
sessionHolder = new SessionHolder(session);
TransactionSynchronizationManager.bindResource(getSessionFactory(), sessionHolder);
Transaction t = getSessionFactory().getCurrentSession().beginTransaction();
try {
//execute your code here
t.commit();
} catch (Exception e) {
t.rollback();
log.error("Error", e);
}
try {
flushIfNecessary(sessionHolder.getSession(), false);
}
catch (HibernateException ex) {
throw convertHibernateAccessException(ex);
}
} finally {
SessionFactoryUtils.closeSession(sessionHolder.getSession());
TransactionSynchronizationManager.unbindResource(getSessionFactory());
}
答案 1 :(得分:0)
您可以使用JPA Entity Manager手动开始和提交事务。 Here is my extended answer