![](/img/trans.png)
[英]Java Hibernate save an object and update a different object using the same session in the same transaction only update and not save
[英]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 begin
并commit
到循环中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.