Hibernate学习笔记 - Session.evict(user)方法
Hibernate学习笔记 - Session.evict(user)方法 
浏览(9)|评论(0)   交流分类:Java|笔记分类: 未分类 
作用:从session缓存(EntityEntries属性)中逐出该对象
java代码:
- 但是与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();
posted on 2012-02-29 23:25 阳光总在风雨后001 阅读(10192) 评论(0) 收藏 举报
 
                    
                     
                    
                 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号 
