我使用spring+hibernate模板处理实体。有大量实体需要一次性加载,因此我从hibernate模板中检索出一个迭代器。
每个实体都应该作为单个工作单元进行处理。我试图将实体处理放在单独的事务中(传播=REQUIRED_NEW)。然而,我最终遇到了一个异常,指出代理绑定了两个会话。这是由于用于迭代器惰性加载的挂起事务所致。我正在使用同一bean进行惰性加载和实体处理。(也许它应该重构成两个单独的dao:一个用于惰性加载,另一个用于处理?)
然后我尝试使用单个事务,在处理每个实体后提交。在这里更好,实体处理期间没有异常,但在处理完成并返回方法后,从spring事务管理代码抛出异常。
@Transactional
public void processManyManyEntities() {
org.hibernate.Sesstion hibernateSession = myDao.getHibernateTemplate().getSessionFactory().getCurrentSession();
Iterator<Entity> entities = myDao.findEntitesForProcessing();
while (entities.hasNext()) {
Entity entity = entities.next();
hibernateSession.beginTransaction();
anotherBean.processSingleEntity(entity);
hibernateSession.getTransaction().commit();
}
}
processSingleEntity
是另一个bean中带有@Transactional
注解的方法,因此所有实体都有一个事务。我检查了哪个事务引起了异常: 它是从hibernateSession.beginTransaction()
返回的第一个事务,所以它在事务管理器中没有更新。
有几个问题:
是否可以在不重构dao的情况下避免会话绑定异常? 这不是相关的问题,因为问题出在Session和Hibernate上,而不是dao。
是否可能在事务管理器中更新事务? 已解决
是否可能在processManyManyEntities
上没有@Transactional
注解的情况下使用相同的事务(对于anotherBean.processSingleEntity(entity);
)?