Hibernate學習筆記 - Session.evict(user)方法


Hibernate學習筆記 - Session.evict(user)方法
瀏覽(9)|評論(0)   交流分類:Java|筆記分類: 未分類

作用:從session緩存(EntityEntries屬性)中逐出該對象

 

java代碼:
  1. 但是與commit同時使用,會拋出異常   
  2.             session = HibernateUtils.getSession();   
  3.             tx = session.beginTransaction();   
  4.        
  5.             User1 user = new User1();   
  6.             user.setName("李四");   
  7.             user.setPassword("123");   
  8.             user.setCreateTime(new Date());   
  9.             user.setExpireTime(new Date());   
  10.                
  11.             //利用Hibernate將實體類對象保存到數據庫中   
  12.             //因為user主鍵生成策略采用的是uuid,所以調用完成save后,只是將user納入session的管理   
  13.             //不會發出insert語句,但是id已經生成,session中的existsInDatabase狀態為false   
  14.             session.save(user);   
  15.                    
  16.             session.evict(user);//從session緩存(EntityEntries屬性)中逐出該對象   
  17.         //無法成功提交,因為hibernate在清理緩存時,在session的臨時集合(insertions)中取出user對象進行insert操作后需要更新entityEntries屬性中的existsInDatabase為true,而我們采用evict已經將user從session中逐出了,所以找不到相關數據,無法更新,拋出異常。   
  18.                
  19.             tx.commit();   
  20.   
  21. 解決在逐出session緩存中的對象不拋出異常的方法:   
  22. 在session.evict()之前進行顯示的調用session.flush()方法就可以了。   
  23.         //利用Hibernate將實體類對象保存到數據庫中   
  24.             //因為user主鍵生成策略采用的是uuid,所以調用完成save后,只是將user納入session的管理   
  25.             //不會發出insert語句,但是id已經生成,session中的existsInDatabase狀態為false   
  26.             session.save(user);   
  27.                    
  28.             //flush后hibernate會清理緩存,會將user對象保存到數據庫中,將session中的insertions中的user對象清除,並且會設置session中的existsInDatabase狀態為false   
  29.             session.flush();   
  30.                
  31.             session.evict(user);//從session緩存(EntityEntries屬性)中逐出該對象   
  32.                
  33.             //可以成功提交,因為hibernate在清理緩存時,在Session的insertions中集合中無法找到user對象所以不會發出insert語句,也不會更新session中existsInDatabase的狀態。   
  34.             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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM