前言
對一個架構的直覺認識,往往是從一個hello world程式開始。hibernate是一個orm(object relationship mapping)對象映射架構。實作了jdbc輕量級的封裝,使得在進行jdbc開發的時候可以直接使用面向對象的思維進行開發,說白了hibernate架構的作用是在java對象與關系資料庫中做了一個映射,使得程式員不用再使用各種sql了。是以總結hibernate以下幾點:
1、完成了對jdbc的封裝,不用再與各種connection打交道了
2、在業務體系中是一個持久層架構(除了持久層還有業務層,主要使用struts2或者springmvc完成,還有視圖層,就是諸如jsp、freemarker啦這些顯示資訊的技術),對持久層的解釋,我摘抄了官方的一句話:
persistence simply means that we would like our application’s data to outlive the applications process. in java terms, we would like the state of (some of) our objects to live beyond the scope of the jvm so that the same state is available later.
3、是一個orm架構,不用與各種sql打交道
hibernate 入門程式:xml版
第一步:在myeclipse中建立一個web項目,取名為hibernate
第二步:在項目中添加使用hibernate架構必須的jar包:如下圖:

第三步:編寫hibernate.cfg.xml配置檔案,代碼如下:
上面的配置檔案指明了一些必要的資料庫連接配接屬性,通過這些屬性,hibernate可以連接配接上資料庫。可以配置各種不同的資料庫,其中sql 方言屬性指明了使用你所配置的資料庫的sql文法(比如oracle與mysql中一些文法還是存在很大不同的)。
第四步:建立bean對象
這是一個标準javabean對象,hibernate也建議我們這麼寫。但是在編寫這個javabean的時候,有幾點需要注意:一是對象的id屬性,另一個是id屬性的set方法。在hibernate架構中,使用一個id為辨別一個對象,是以在javabean中為一個對象添加id屬性是必要的,因為在使用hibernate架構時候,隻有hibernate才可以為一個對象配置設定id值(你可以試試在沒有添加id屬性的時候會出現什麼異常)。另外,由于id是一個對象的标示符,是以我們一般禁止其他對象對這個屬性進行随意的修改,是以将其set通路設為private也是出于這個層面的考慮。
第五步:編寫person.hbmxml映射檔案,該檔案的作用是把java中的bean對象與資料庫中(确切說是rdbms,關系資料庫)中一條記錄做了一個映射(這裡就是orm的關鍵),代碼如下:
建立javabean之後,就是上面的映射檔案了,上面的檔案名以及檔案内容可能有一些難以了解的地方。首先我們得知道,一個映射檔案(字尾hbm也正是hibernate映射檔案的意思)的作用是什麼?前面提到了hibernate是一個對象映射架構,對象映射到哪裡去了呢?當然是資料庫中資料表的一條記錄(一個對象映射到了資料庫表的一條記錄,就這麼了解)了。那麼這個映射的過程的實作就是通過上面的映射檔案了。映射檔案告訴hibernate怎麼樣去加載和存儲持久化類的對象,映射檔案告訴hibernate去資料庫中的那張表尋找以及應該使用表中的哪些字段。
除此之外,我們注意到,有一些屬性并沒有指定type屬性,有一些卻指定了,那麼什麼類型屬性需要指定,什麼類型又不需要呢?對于一些常見的類型(
第六步:編寫測試程式實作crud操作
在測試的時候,為了對每個操作是否成功進行測試,可以把其他程式注釋。其中涉及了hibernate一些核心類:sessionfactory、session和transaction。
1、sessionfactory
熟悉設計模式的小夥伴應該知道,這是典型的工廠模式,一個org.hibernate.sessionfactory工廠對象就是生成org.hibernate.session執行個體的。在整個應用程式總一個org.hibernate.sessionfactory應該隻被初始化一次,并且應該是線程安全的。是以上面的代碼使用hibernateutils類封裝了sessionfactory執行個體,進而保證了整個應用期間,隻有一個sessionfactory執行個體。這也是設計模式的一種——單例模式。對sessionfactory的解釋我引用官方的一句話:
a threadsafe, immutable cache of compiled mappings for a single database. a factory for session and a client of connectionprovider, sessionfactory can hold an optional (second-level) cache of data that is reusable between transactions at a process, or cluster, level.
下面是hibernateutils.java的代碼:
2、session
session代表了一個工作單元,一個session的産生往往是在事務開始的時候建立的,比如在調用getcurrentsession方法的時候,一個事務就開始了。通過這種方式擷取的session與opensession方法的不同在于前者在事務結束的時候就會自動關閉,是以在一個事務commit或者rollback的時候,該session對象就已經關閉了。而後者則可以一直生效,每次得到的session都是一個新的對象。
session is a single-threaded, short-lived object representing a conversation between the application and the persistent store. it wraps a jdbc connection and is a factory for transaction. session holds a mandatory first-level cache of persistent objects that are used when navigating the object graph or looking up objects by identifier.
3、transaction
資料庫中事務的概念是指通路并且可能更新資料項的程式執行單元,在sql程式設計中,一個事務可能是一條sql查詢語句。在hibernate中,事務是與session相關的。對此官方解釋如下:
(optional) a single-threaded, short-lived object used by the application to specify atomic units of work. it abstracts the application from the underlying jdbc, jta or corba transaction. a session might span several transactions in some cases. however, transaction demarcation, either using the underlying api or transaction, is never optional.