Hibernate学习--- Session.evict()方法

    但是与commit同时使用,会抛出异常   
                session = HibernateUtils.getSession();   
                tx = session.beginTransaction();   
           
                User1 user = new User1();   
                user.setName("李四");   
                user.setPassword("123");   
                user.setCreateTime(new Date());   
                user.setExpireTime(new Date());   
                   
                //利用Hibernate将实体类对象保存到数据库中   
                //因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理   
                //不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false   
                session.save(user);   
                       
                session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象   
            //无法成功提交,因为hibernate在清理缓存时,在session的临时集合(insertions)中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session中逐出了,所以找不到相关数据,无法更新,抛出异常。   
                   
                tx.commit();   
      
    解决在逐出session缓存中的对象不抛出异常的方法:   
    在session.evict()之前进行显示的调用session.flush()方法就可以了。   
            //利用Hibernate将实体类对象保存到数据库中   
                //因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理   
                //不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false   
                session.save(user);   
                       
                //flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false   
                session.flush();   
                   
                session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象   
                   
                //可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。   
                tx.commit();  



但是与commit同时使用,会抛出异常
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
	
			User1 user = new User1();
			user.setName("李四");
			user.setPassword("123");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());
			
			//利用Hibernate将实体类对象保存到数据库中
			//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
			//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
			session.save(user);
				
			session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
		//无法成功提交,因为hibernate在清理缓存时,在session的临时集合(insertions)中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session中逐出了,所以找不到相关数据,无法更新,抛出异常。
			
			tx.commit();

解决在逐出session缓存中的对象不抛出异常的方法:
在session.evict()之前进行显示的调用session.flush()方法就可以了。
		//利用Hibernate将实体类对象保存到数据库中
			//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
			//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
			session.save(user);
				
			//flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false
			session.flush();
			
			session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
			
			//可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。
			tx.commit();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值