- 配置對象Configuration
作用:讀取配置文檔:Hibernate.cfg.xml敞嗡; - 創(chuàng)建SessionFactory對象
作用:讀取相應(yīng)的里面加載的對象關(guān)系映射文件 - 創(chuàng)建session文件
作用:類似于JDBC中的Connection,這個session對象等同于連接對象
執(zhí)行增刪改查:save,delete身冬,update,createQuery等色难。 - 執(zhí)行某個session對象的方法的時候,必須開啟一個事物transaction席赂,這些方法需要封裝在事物當中。
- 執(zhí)行完成方法之后时迫,需要提交事務(wù)并且關(guān)閉session
transaction.commit();
session.close();
session與connection是多對一的關(guān)系颅停,每個session都有一個與之對應(yīng)的connection,一個connection不同時刻可以供多個session使用掠拳。
Configuration類(管理Hibernate的配置信息)
Configuration 類負責管理 Hibernate 的配置信息癞揉。包括如下內(nèi)容:
- 加載hibernate.properties 和 hibernate.cfg.xml
- 持久化類與數(shù)據(jù)表的映射關(guān)系(*.hbm.xml文件)
創(chuàng)建Configuration 的兩種方式:
屬性文件(hibernate.properties):
Configuration cfg = new Configuration(); //手動加載hbmXml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
在核心配置文件中引入映射配置文件:
- 之前做法:
<!-- 引入映射配置文件 -->
<mapping resource="com/meng/entity/Users.hbm.xml" />
- 還有另外方式加載映射配置文件(了解)
SessionFactory接口(獲取Session對象)
Configuration對象根據(jù)當前的配置信息生成SessionFactory對象
- SessionFactory對象中保存了當前數(shù)據(jù)庫配置信息和所有映射關(guān)系以及預(yù)定義的SQL語句
- SessionFactory對象是線程安全的
- SessionFactory還負責維護Hibernate的二級緩存
Configuration configuration = new Configuration().configure();
創(chuàng)建sessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
可以通過SessionFactory對象 獲得Session對象
Session session = sessionFactory.openSession();
或者
Session session = sessionFactory.getCurrentSession();
openSession與getCurrentSession的區(qū)別
- openSession 每次使用都是創(chuàng)建一個新的session;getCurrentSession 是獲取當前session對象溺欧,連續(xù)使用多次時喊熟,得到的session都是同一個對象。
- getCurrentSession在事物提交或者回滾之后會自動關(guān)閉姐刁;而openSession需要手動關(guān)閉芥牌,如果使用openSession而沒有手動關(guān)閉,多次使用之后會導致連接池溢出聂使。
- 一般在實際開發(fā)中壁拉,往往使用getCurrentSession多,因為一般是處理同一個事務(wù)柏靶,所以在一般情況下比較少使用openSession弃理。
構(gòu)造SessionFactory 很消耗資源,一般情況下一個應(yīng)用只初始化一個
Session接口(CRUD操作)
- 調(diào)用Session里面的方法屎蜓,實現(xiàn)crud操作痘昌。
- Session是單線程對象,只能有一個操作時候梆靖,不能同時多個操作使用控汉,不要把Session變量定義成成員變量,每次使用都創(chuàng)建新對象返吻,相當于JDBC的Connection姑子。
- Session是應(yīng)用程序與數(shù)據(jù)庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心测僵;Session是線程不安全的街佑。
- 所有持久化對象必須在Session 的管理下才可以進行持久化操作。
- Session 對象有一個一級緩存捍靠,顯式執(zhí)行 flush 之前沐旨,所有的持久化操作的數(shù)據(jù)都緩存在 session 對象處。
- 持久化類與 Session 關(guān)聯(lián)起來后就具有了持久化的能力榨婆。
常用方法
Transaction接口(事務(wù))
代表數(shù)據(jù)庫操作的事務(wù)對象
- hibernate對數(shù)據(jù)庫的操作都是封裝在事物transaction當中磁携,并且默認是非自動提交的方式,所以用session保存對象時良风,若不開啟事務(wù)谊迄,并手工提交事務(wù)闷供,對象時不會保存到數(shù)據(jù)庫當中的。
- 如果你想讓Hibernate向jdbc那樣自動提交事務(wù)统诺,可以不開啟事物歪脏,用session的doWork()方法,并設(shè)置自動提交事務(wù)粮呢,在保存對象之后婿失,記得用session.flush();來輸出SQL語句,不然對象也是不會保存到數(shù)據(jù)庫中的啄寡。但一般是不建議用第二種方法豪硅,都是用事物來封裝對數(shù)據(jù)庫的操作。
Session session = sessionFactory.getCurrentSession(); // 寫添加邏輯 // 項數(shù)據(jù)庫設(shè)置值 Users user = new Users(); user.setUsername("siru"); user.setPassword("654123"); session.doWork(new Work() { @Override public void execute(Connection connection) throws SQLException { connection.setAutoCommit(true); } }); session.save(user); session.flush();
開啟事務(wù)
Transaction transaction = session.beginTransaction();
提供事務(wù)管理的方法:
- commit(): 提交相關(guān)聯(lián)的session實例
- rollback(): 撤銷事務(wù)操作
- wasCommitted(): 檢查事務(wù)是否提交