在使用Hibernate的時候,我們通常都會用的Configuration、SessionFactory、Session、Transaction、Query和Criteria等接口。通過這些接口可以,不僅可以存儲與取出持久化對象,還可以對事務(wù)進行管理。下面對著幾個接口一一介紹:
幾個接口之間的層次關(guān)系如下圖:
Configuration:
Configuration是Hibernate的入口,負責(zé)將配置文件信息加載到內(nèi)存,并創(chuàng)建一個SessionFactory對象,把讀入的配置信息加載到SessionFactory對象的內(nèi)存里。
特點:
Configuration對象的作用是除了有讀取配置文件的功能,還能創(chuàng)建SessionFactory對象。Configuration對象只存在于系統(tǒng)的初始化階段,然后所有的持久化操作都能通過這個SessionFactory實例來進行。Configuration對象只有在Hibernate 進行初始化的時候才需要創(chuàng)建,當(dāng)使用Configuration對象的實例創(chuàng)建了SessionFactory對象的實例后,其配置信息已經(jīng)綁定在他返回的SessionFactory對象實例中。因此,一般情況下,得到SessionFactory對象后,Configuration對象的使命就結(jié)束了。
用法:
屬性文件(hibernate.properties):Configuration cfg = new Configuration();Xml文件(hibernate.cfg.xml):Configuration cfg = new Configuration().configure();
SessionFactory:
SessionFactory負責(zé)創(chuàng)建Session實例,每個SessionFactory實例對應(yīng)一個數(shù)據(jù)庫。SessionFactory是重量級的,占用緩存較大,所以每個數(shù)據(jù)庫只需創(chuàng)建一個SessionFactory實例,當(dāng)需要操作多個數(shù)據(jù)庫時,再為每一個數(shù)據(jù)庫指定一個SessionFactory實例。
特點:
用法:
Configuration config = new Configuration();ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();SessionFactory sessionFactory = config.buildSessionFactory(sr);
Session:
Session是Hibernate持久化操作的基礎(chǔ),負責(zé)管理所有與持久化有關(guān)的操作,Session與SessionFactory不同,它是輕量級的,也是非線程安全的。創(chuàng)建和銷毀不會消耗太多資源,可以為每一個請求分配一個Session。
特點:
用法:
Session session = sessionFactory.openSession();常用方法:session.save();session.update();session.saveOrUpdate();session.delete();
Transaction:
Transaction負責(zé)Hibernate的數(shù)據(jù)庫事務(wù),其實Hibernate本身并不具備事務(wù)管理的能力,只是對底層事務(wù)接口進行了封裝,這樣有利于在不同環(huán)境或容器中移植,也可以直接訪問底層的事務(wù)接口。
用法:
Transaction tx = session.beginTransaction();
Query和Criteria:
Query和Criteria負責(zé)Hibernate的查詢操作。Query實例封裝了一個HQL(Hibernate Query Language)查詢語句,HQL與SQL有些類似,只是HQL是面向?qū)ο蟮?,它操作的是持久化類的類名和屬性名,而SQL操作的是表名和字段名。Criteria實例完全封裝了字符串形式的查詢語句,它比Query實例更加面向?qū)ο?,更適合執(zhí)行動態(tài)查詢。
本文只是對這幾個接口的一個簡單介紹,它們還有很多需要我們?nèi)W(xué)習(xí)跟了解的地方,這幾個接口有一個共同的目的,就是讓我們用更加面向?qū)ο蟮姆绞饺ゾ幊獭?/p>
更多建議: