• hibernate中session.flush()


    flush()
    session flush在commit之前默认都会执行, 也可以手动执行,他主要做了两件事:
    1) 清理缓存。
    2) 执行SQL。
    flush: Session 按照缓存中对象属性变化来同步更新数据库。


    默认情况下,Session 会在以下情况下调用 flush刷新缓存:
    1、显式调用 Session 的 flush() 方法
    2、当应用程序调用 Transaction 的 commit()方法的时, 该方法先 flush ,然后在向数据库提交事务
    3、当应用程序执行一些查询(HQL, Criteria)操作时,如果缓存中持久化对象的属性已经发生了变化,会先 flush 缓存,以保证查询结果能够反映持久化对象的最新状态
    Session 的 save() 方法使一个临时对象转变为持久化对象


    Session 的 save() 方法完成以下操作:
    1、把 News 对象加入到 Session 缓存中, 使它进入持久化状态
    2、选用映射文件指定的标识符生成器, 为持久化对象分配唯一的 OID. 在 使用代理主键的情况下, setId() 方法为 News 对象设置 OID 使无效的.
    3、计划执行一条 insert 语句:在 flush 缓存的时候(意思是flush执行insert语句,但是未执行commit)

    flush 缓存的例外情况:如果对象使用native 生成器生成 ID 时,在当调用session.save() 去保存对象时, 会直接向数据库插入该实体的 insert 语句。
    如果session 中的某个类的属性发生了改变,使用flush() 方式,去更改数据库中的记录,使其和改变后的session 中的对象一致
    Force this session to flush.强制刷新流的缓冲。flush必须在一个操作单元结束之后且在提交事务和关闭连接之前被调用。例如插入一条数据。
    sess.save(user);的意思是将user持久化,

        /*
         * 现在我的主键生成策略是uuid,这个主键是由Session生成,执行完save就会生成主键。
          * user对象会存储在Session的临时存储区以及持久区。
            * 这里是不会发送ql语句的,sql语句是在执行flush();方法的时候被执行。
        */
        session.save(user);
        /*
         * 发出sql语句,清理临时存储区,将dirty由true变为false,表示此时的数据不是脏数据,没有flush之前是脏数据。
         */ 
        session.flush();
        t.commit();

    session.save(),进行插入数据操作时,一直没有成功,也没有报错。后来发现是因为没有创建事务,提交事务的原因
    你对flush和commit的意思没有理解到:
    1,flush代表刷新,同步一级缓存中的对象到数据库中,仅仅代表把SQL刷到了数据库中(意思是flush执行insert语句,但是未执行commit)
    2,commit代表提交事务,tx.commit之后,之前发送的SQL才真正提交了,数据表里面才有值;
    3,在默认情况下,commit之前都要自动调用flush,
    所以:
    1,session.save();session.flush()只是把SQL发到了数据库中,事务没有提交,数据表中还是没有数据的,
    2,session.save(),transaction.commit(),在commit的之前,隐含调用了flush,即发送了SQL,又提交了事务,所以有值;

  • 相关阅读:
    内联表值函数FUNCTION
    视图
    公用表表达式(CTE)
    关于TOP (n) WITH TIES的运用
    Python类变量和实例变量(类属性和实例属性)
    方差、协方差、相关系数(转载)
    Fama-French三因子模型
    (转载)什么是阿尔法和贝塔
    Macaca 环境搭建
    UIRecorder + Macaca 自动化测试 Android
  • 原文地址:https://www.cnblogs.com/zhaoyanhaoBlog/p/11288304.html
Copyright © 2020-2023  润新知