在Java Spring MVC Web应用程序中,我具有基于注释的配置。我有一个服务类方法,该方法从数据库中获取对象列表,然后更新每个对象,然后将其保存回去。方法与以下类似:
@Transactional
public void updateSchools()
{
List<CbSchoolTO> schoolList = CbSchoolDao.getSchoolsByExpiryDate(date);
for (CbSchool cbSchool : schoolList)
{
updateSchool(cbSchool);
}
}
@Transactional
public void updateSchool(CbSchool cbSchool)
{
//perform the operation
}
从**updateSchool**
方法开始,将调用dao
方法,该方法将按如下所示保存更新:
public void saveOrUpdateSchool(CbSchool cbSchool) throws HibernateException
{
getCurrentSession().saveOrUpdate(school);
}
现在我要做的是在进行更新时向每所学校提交数据库,而不是等待整个事务完成。
我发现的选择之一是不要将更新单个学校的方法置于共同事务之下。但是,如果我从必须获取学校列表的第一种方法中删除了@transactional
,我就会遇到一个例外:No hibernate session bound to thread
。
我列出学校的dao方法如下:
public List<CbSchool> getSchoolsByExpiryDate(Date currentDate) throws HibernateException
{
Query query = getCurrentSession().createQuery("FROM CbrainSchoolTO WHERE endDate < :currentDate
query.setParameter("currentDate", currentDate);
List<CbSchool> resultList = query.list();
if (resultList != null && !resultList.isEmpty())
{
return resultList;
}
return null;
如何在每次更新后提交提交,而不是用当前配置等待整个批处理。
我还找到了以下代码来手动创建交易:
Transaction tx = HibernateUtil.getCurrentSession().beginTransaction();
//readonly operation here
tx.commit()
但是我无法导入HibernateUtil
。我对休眠的Maven依赖是:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.5.1-Final</version>
</dependency>
我应该更改休眠版本并尝试吗?