1.
SessionFactory這個是工廠類,生產session的,就相當於JDBC裏面的DriveMannager,
第一種獲取Session的方法
Session session = SessionFactory.openSession();
session就是用來數據庫crud的,也就是update,delete,select,insert的,
相當於JDBC的statement,prearatement,
用openSession()獲取session,是每次調用這個方法的時候獲取一個新的session
第二種獲取Session的方法
Session session =SessionFactory.getCurrentSession();
它獲取的session是通過上下文, session有個Context方法用來管理session的
獲取session後放入線程池進行管理,也就是說Session達到了共享
什麼時候用openSession() 什麼時候用getCurrentSession()????
最主要的是我們在用事務的時候儘量用getCurrentSession
它可以保持數據的完整性,避免不必要的錯誤,
比如你修改一張表的同時,另外一個人在插入,此時如果你用openSession的話,
如果你修改一張表失敗,另外一個人有插入成功,而數據庫是原子性的,
事務性的特點是,要麼全部成功,要麼全部失敗.
顯然這裏用OpenSession()是不正確的,
getCrueetSession()爲什麼可以達到數據庫的原子性呢?
原因是它是線程安全的.他們共用一個session,一個session的事務肯定是同步的
他們兩者還有個區別,當在查詢的時候要用openSession(),如果用getCurrentSession()就會出異常。
我們來淺談下Session的幾個常用方法:
當我們對錶進行插入數據,修改數據,刪除數據的時候
一定要開啓事務,和提交事務,及回滾事務,
這樣Hibernate才能把數據對象與表映射起來,不然也只能是在內存中做了修改
一旦連接斷開,數據就消失,而數據庫裏面數據沒有任何變化
但是進行查數據的時候就不用擔心了
1.load方法和get方法
load(Class,id)通過對象和id來查找相應的數據,返回該數據對應的實體類對象
load和get方法很相似都是進行數據庫的查找,
但是load()方法是懶加載,它不是直接進行sql語句查詢,而是去緩衝區中查詢,如果緩衝區
中沒有此對象,就會去二級緩存裏面查找,如果沒有,它不會去數據庫中查詢
而是直接返回一個代理類對象,通過這個代理類對象可以查詢到ID,
如果一旦你關閉Session後
是無法查詢到其他數據,如果進行查詢會拋出異常,如果一定要查詢到,就必須初始化這個代理類
用到Hibernate.initialize(object)這樣就可以進行查詢了
但是session不關閉又會有很大的影響,這個解決辦法可以用spring來解決
而get方法是直接進行sql語句查詢的,緩存區中查找不到,直接跑到數據庫中去查找
如果數據庫中查找不到就會返回一個null
2.save方法是進行插入操作
session.save(Object obj);插入你實體類的對像。然後運用Hibernate的sql語句進行insert操作
在這裏我強調一點
如果你的對象set了Id是無效的,如果你配置文件中指定了指定的增長方式,就按照指定的進行
如果沒指定,hibernate會自動的增長,從1開始
因爲看Log加載程序是Hibernate有個序列還是觸發的。
當你save方法後。 對象就從瞬態變成持久化,會被保存到session二級緩存中..
在commit之前,你可以再對對象進行set 而最後調用commit的時候,就會以最後set的值來與數據庫對應
commit方法的作用是,把緩存中的數據與數據庫進行同步。
3.update, delete,方法
update是進行數據的更新。
update是把數據從遊離狀態編程持久狀態
delete對數據進行刪除操作
delete是把數據從持久狀態編程移除狀態,它還會在session緩存區中,但是
在數據庫中對應的數據沒有了
一旦session緩存消失了。此對象也就沒有太大意義了
Session的入門常用方法
(1)Query query = session.createQuery(hql):利用hql查詢語句查詢;
(2)Criteria critera = session.createCriteria(Class clazz);
(3)Transaction tx = session.beginTransaction(); //開始事務;tx.commit()提交事務;
(4)session.close();//關閉Session,此後被session管理的持久化對象變爲脫管狀態;
(5)session.save(Object obj); //添加
(6)session.update(Object obj); //更新
(7)session.delete(Object obj); //刪除
(8)Object obj = session.get(Class clazz,Serialiazble id); //根據主鍵查找記錄並返回;
(9)Object obj = session.load(Class clazz,Serializable id); //和get方法效果一樣,但是是懶加載,即在不使用他之前他不會返回對象;