1. session是用來執行對象的crud操做,而且session是對象事務工廠。session是線程級別的,因此生命週期比較短。數據庫
2.session中對象的生命週期圖:session
3.session中對象的狀態ide
瞬時狀態spa
持久狀態線程
遊離狀態code
4.對象的生命週期一:對象
new---->瞬時狀態----->save------>持久狀態----->close----->遊離狀態blog


public class HibernateTest { @Test public void testSession1(){ Session session = null; Transaction tx = null; User user=null; try { //user處於瞬時狀態,session沒有管理該對象 user = new User(); user.setName("小菜"); user.setAge(40); session = HibernateUtil.getSession(); //獲取事務 tx = session.getTransaction(); //開啓事務 tx.begin(); //被保存後 user處於持久狀態,session開始管理該對象 //處於持久狀態的數據 session會進行髒數據檢查 session.save(user); user.setName("菜10"); //提交事務----提交事務後進行髒數據檢查後 會進行數據同步 tx.commit(); } catch (Exception e) { if(tx!=null) tx.rollback(); }finally { HibernateUtil.close(); } //user處於遊離狀態 session無論理user System.out.println("user==="+user); } }
5.對象的生命週期二:
get---->直接進入持久化狀態---->clear------>遊離狀態------>update------->持久化狀態------->delete------->瞬時狀態生命週期


@Test public void testSession2(){ Session session = null; Transaction tx = null; User user=null; try { session = HibernateUtil.getSession(); //獲取事務 tx = session.getTransaction(); //開啓事務 tx.begin(); //直接從數據庫中獲取數據 數據處於持久狀態 user = (User)session.get(User.class, 3); //清理session中的全部數據 user不被session管理 處於遊離狀態 session.clear(); user.setName("衛斯理"); user.setAge(90); //執行更新操做後 user處於持久狀態 session.update(user); //執行delete處於瞬時狀態 session.delete(user); tx.commit(); } catch (Exception e) { if(tx!=null) tx.rollback(); }finally { HibernateUtil.close(); } //user處於瞬時狀態 session無論理user System.out.println("user==="+user); }
6.對象生命狀態總結事務
瞬時狀態:session中沒有,數據庫中也沒有
持久狀態:session中有,數據庫中也有
遊離狀態:session中沒有,數據庫中有
7.在執行對象的刪除和對象的更新時,應遵循對象的生命週期狀態圖,也就是應該先查詢後更新或刪除。