【问题标题】:hibernate save and get using same session ,same transaction休眠保存和获取使用相同的会话,相同的事务
【发布时间】:2011-09-21 08:07:39
【问题描述】:

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

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() 之后强制写入数据库而不是像上面那样等待提交?

【问题讨论】:

    标签: java hibernate spring transactions


    【解决方案1】:

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

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

    如果您使用的 SQL 客户端工具允许您指定隔离级别 - 以隔离方式启动 SQL 客户端会话 read_uncommited - 将允许您在事务提交之前查看所做的更改。

    【讨论】:

    • 这不是getHibernateTemplate().flush()重操作。如果我们在循环中调用它,它不会影响加载,应用程序的性能吗?
    【解决方案2】:

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

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

    【讨论】:

    • 如何检查是否是同一个hibernatetemplate()。 hibernatetemplate() 中的任何方法,我可以检查类序列号..etc 吗? =)
    • @cometta 只需分配并重用它,而不是一遍又一遍地调用 getHibernateTemplate。
    【解决方案3】:

    据我所知,你根本做不到。它不起作用。无法在同一事务中检索已保存的对象。我认为这是因为会话是一级缓存,只有当创建该对象的另一个事务提交时,Hibernate 才能获取新对象。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2017-08-04
        • 1970-01-01
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多