Java 为什么我们在冬眠时需要冲水?

Java 为什么我们在冬眠时需要冲水?,java,hibernate,session,Java,Hibernate,Session,我最近刚开始使用hibernate 3.x,我对以下语句感到困惑:“刷新会话将强制hibernate将会话的内存状态与数据库同步。” 请帮助我理解以下几点- flush将会话的内存状态与数据库同步这意味着什么?这意味着执行查询(例如insert语句)并将数据保存到表中,但我们无法在其他会话中看到数据 刷新后,此数据将驻留在会话对象或数据库表本身中的位置 如果发生任何异常,那么异常场景会如何发生 请通过一个示例帮助我理解flush的工作原理。强制会话刷新。它用于将会话数据与数据库同步。 调用ses

我最近刚开始使用hibernate 3.x,我对以下语句感到困惑:“刷新会话将强制hibernate将会话的内存状态与数据库同步。”

请帮助我理解以下几点-

  • flush将会话的内存状态与数据库同步这意味着什么?这意味着执行查询(例如insert语句)并将数据保存到表中,但我们无法在其他会话中看到数据

  • 刷新后,此数据将驻留在会话对象或数据库表本身中的位置

  • 如果发生任何异常,那么异常场景会如何发生


  • 请通过一个示例帮助我理解flush的工作原理。

    强制会话刷新。它用于将会话数据与数据库同步。 调用session.flush()时,这些语句在数据库中执行,但不会提交

    如果不调用session.flush()并且调用session.commit(),则内部commit()方法将执行语句并提交

    所以commit()=flush+commit

    所以seision.flush()只执行数据库中的语句(但不执行提交),而语句不再在内存中。它只是强制会话刷新

    Flush主要用于处理成千上万的记录。 因此,在处理如此多的记录时,我们使用批更新和刷新

    Session session = SessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    for ( int i=0; i<100000; i++ ) {
        Employee emp = new Employee(.....);
        session.save(emp);
    }
    tx.commit();
    session.close();
    
    Session Session=SessionFactory.openSession();
    事务tx=会话.beginTransaction();
    
    对于It i=0;为什么我们不能直接忘记语句“提交=刷新”+提交一段时间。想象图片中根本没有刷新,那么如果直接提交会有什么不利之处。考虑一个场景,会话中有10k插入语句,内存大小很低。tement将在数据库上执行,但只要您没有提交操作,数据就不会反映在数据库上。现在您想要回滚那些insert语句,您可以回滚它们,因为我们没有提交操作。我们通常将10k记录转换为10组1k记录,因为我们没有巨大的内存来存储这些记录会话中的记录如果我们提交了该操作,则无法回滚。因此,这意味着在刷新后,如果我回滚该事务,然后提交该事务,则数据将不会保存在数据库中。@Monica刷新后的数据将从内存中清除