Hibernate的flush 和 clear 方法解释

1.flush

flush是Hibernate强制更新、将session与数据库同步的一种方法

请看以下代码

    @Test
    public void flush() {
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();
        
        User user=null;
        user=(User) session.get(User.class, 1);
        user.setUserName("jack");
        
        session.flush();
    
        user.setUserName("jack_new");
            
        tx.commit();
        session.close();

输出的结果是 Hibernate: update A set userName=? where userId=?
                         Hibernate: update A set userName=? where userId=?

说明数据库已经更新过两次,

而如果将  session.flush();删除,那么只会更新一次

这就是flush的作用

2.clear

clear是Hibernate一种强制清除所有session缓存的方法,

请看以下对比代码

2.1、这是没有clear方法的代码

public void clear() {
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();
        
        User user=null;
        
        user=(User) session.get(User.class, 1);
        
    
        user=(User) session.get(User.class, 1);
        
        tx.commit();
        session.close();

这里输出Hibernate: select user0_.userId as userId0_0_, user0_.userName as userName0_0_ from A user0_ where user0_.userId=?
只有一条查询结果

2.2、这是有clear方法的代码

public void clear() {
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();
        
        User user=null;
        
        user=(User) session.get(User.class, 1);
        session.clear();
    
        user=(User) session.get(User.class, 1);
        
        tx.commit();
        session.close();


这里输出Hibernate: select user0_.userId as userId0_0_, user0_.userName as userName0_0_ from A user0_ where user0_.userId=?
                Hibernate: select user0_.userId as userId0_0_, user0_.userName as userName0_0_ from A user0_ where user0_.userId=?
              两条运算结果

结论:有clear清除了session一级缓存,那么红色部分的user获取只能从数据库中拿到,所以拿到两个结果(因为session的get方法会 先检查缓存中是否有数据,如果有不查询数据库,直接从缓存中获取)

            但是2.1中的user获取是在同一个session缓存区中拿的,所以他们本来就是同一个缓存区域里的东西,所以输出来的只有一个结果。

       




总结:

  缓存相关几个方法的作用

session.flush();       让一级缓存与数据库同步

session.evict(arg0);    清空一级缓存中指定的对象

session.clear();       清空一级缓存中缓存的所有对象


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值