繁体   English   中英

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

[英]hibernate save and get using same session ,same transaction

我有一个场景服务层是事务性的,在其中我只能在完成事务之后提交。 我将其简化为如下所示。

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();

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

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

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

如果您使用的SQL客户端工具允许您指定隔离级别-以read_uncommited隔离启动SQL客户端会话-甚至可以在提交事务之前查看已完成的更改。

每次getHibernateTemplate()返回相同的模板吗? 或者,如果不是基于公共会话的模板。 您最好将模板保存到局部变量中并重用它,而不是每次都调用getHibernateTemplate()。

begin transaction

template = getHibernateTemplate();

for(loop){

template.save(object);


template.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();

我认为您的问题可能是因为您使用不同的会话进行保存和获取电话。 如果它们是在同一会话中进行的,则应该看到所需的行为。

据我了解,您根本无法做到。 没用 无法在同一事务中检索保存的对象。 我认为这是因为会话是一级缓存,并且Hibernate仅在提交另一个创建该对象的事务时才可以获取新对象。

为什么需要按键获取对象? 您已经有了对象! 如果确实需要对象键(用于打印吗?),则可以对每个保存操作使用一个新事务,将transaction begincommit到循环中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM