hibernate保存并使用相同的会话,相同的事务

com*_*tta 8 java spring hibernate transactions

我有一个场景服务层是事务性的,我只能在完成trandaction之后提交.我把它简化成如下所示.

begin transaction

for(loop){

getHibernateTemplate().save(object);


getHibernateTemplate().get(object_by_key); //cannot get object by object_by_key because "object" is not commit into database until entire for(loop) completed. 

}

end transaction. commit();
Run Code Online (Sandbox Code Playgroud)

我尝试在save()之后放入getHibernateTemplate().flush()并且能够在show_sql中看到"insert".但记录未显示在数据库内部.如何在每次save()之后强制写入数据库,而不是像上面那样等待提交?

gka*_*mal 5

getHibernateTemplate().flush()是强制hibernate写入数据库的方法(发送插入和更新查询).这是在事务中完成的,因此在提交事务之前,其他事务(从SQL客户端查询)不可见.

如果插入查询显示在日志中,则它已发送到数据库.如果你想测试记录是否正确插入 - 你可以做一个getHibernateTemplate().clear()(它将删除所有缓存的数据),然后做一个getHibernateTemplate.get()(它将从dataSource查询) .或者另一种测试方法是使用jdbcTemplate(使用相同的数据库)进行查询和检查.

如果您使用的是SQL客户端工具允许您指定的隔离级别 - 开始在read_uncommited隔离SQL客户端会话 - 将让你看到交易将提交之前也做了改变.