【发布时间】:2012-03-12 01:40:52
【问题描述】:
我使用spring+hibernate模板来处理实体。一次加载的实体数量相当多,所以我从休眠模板中检索了一个迭代器。
每个实体都应该作为一个单独的工作单元来处理。我试图将实体处理放在一个单独的事务中(传播 = REQUIRED_NEW)。但是,我以异常结束,指出代理绑定到两个会话。这是由于用于迭代器延迟加载的暂停事务。我使用相同的 bean 进行延迟加载和处理实体。 (也许应该重构为两个独立的 daos:一个用于延迟加载,一个用于处理?)
然后我尝试使用在处理每个实体后提交的单个事务。这里好多了,实体处理过程中没有异常,但是处理完成,方法返回后,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 是另一个用@Transactional 注释的bean 中的方法,因此所有实体都有一个事务。我检查了导致异常的事务:它是从hibernateSession.beginTransaction() 返回的第一个事务,所以它只是没有在事务管理器中更新。
有几个问题:
是否可以在不重构 dao 的情况下避免会话绑定异常?这不是相关问题,因为问题在于 Session 和休眠而不是 dao
是否可以在事务管理器中更新事务? 已解决
是否可以在processManyManyEntities 上使用没有@Transactional 注释的相同事务(对于anotherBean.processSingleEntity(entity);)?
【问题讨论】: