一、hibernate是什么?
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用。----百度百科
其實我自己的理解是,使用hibernate,最常用的場景是,使用它的ORM機制,然后把傳統的關系型數據庫操作,轉換為面向對象的方式來操作。為什么這么做呢?在沒有使用到ORM之前。一個簡單的例子,你在表單上,填了好多個數據,姓名,性別,年齡。。。。。愛好等等等,然后你使用JDBC去連接數據庫,接下來一條一條的把數據從request或者某個地方讀進來,如果有100個,表示需要定義100個變量來暫存這些表單數據,然后在保存到數據庫中,在保存的時候,也要一下下的寫sql語句,再次傳100個值。。。如果是1000個。。想想就好累,我現在某個公司,學習使用PHP,存儲數據的時候,就是這樣一下下來,心好累。
那么如果有了ORM,是什么情況,你只要把對應的數據庫的表,映射為一個對象(比如student)。然后在表單對應的input的name上,填寫對應對象的對應屬性(比如student.name),然后在保存的時候,在提交到的Action中,定義一個student的對象實例,那么這些數據就會自動保存在這個對象中了(我用了Struts2,不扯這個,只是說明效率)。接下來,你只需要保存一下這個對象就ok了。是不是感覺方便了好多。
二、什么是sessionfactory
SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,並負責創建Session對象。這里用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因為一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以為每個數據庫指定一個SessionFactory。----百度百科
三、session對象的創建
在Hibernate中,Session負責完成對象持久化操作。該文件負責創建Session對象,以及關閉Session對象。從該文件可以看出,Session對象的創建大致需要以下3個步驟:
① 初始化Hibernate配置管理類Configuration。
② 通過Configuration類實例創建Session的工廠類SessionFactory。
③ 通過SessionFactory得到Session實例。
Configuration負責管理Hibernate的配置信息。Hibernate運行時需要一些底層實現的基本信息。這些信息包括:數據庫URL、數據庫用戶名、數據庫用戶密碼、數據庫JDBC驅動類、數據庫dialect。用於對特定數據庫提供支持,其中包含了針對特定數據庫特性的實現,如Hibernate數據庫類型到特定數據庫數據類型的映射等。
使用Hibernate必須首先提供這些基礎信息以完成初始化工作,為后續操作做好准備。這些屬性在Hibernate配置文件hibernate.cfg.xml中加以設定,當調用:
Configuration config=new Configuration().configure();
時,Hibernate會自動在目錄下搜索hibernate.cfg.xml文件,並將其讀取到內存中作為后續操作的基礎配置。
SessionFactory負責創建Session實例,可以通過Configuration實例構建SessionFactory。
Configuration config=new Configuration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
Configuration實例config會根據當前的數據庫配置信息,構造SessionFacory實例並返回。SessionFactory一旦構造完畢,即被賦予特定的配置信息。也就是說,之后config的任何變更將不會影響到已經創建的SessionFactory實例sessionFactory。如果需要使用基於變更后的config實例的SessionFactory,需要從config重新構建一個SessionFactory實例。
SessionFactory保存了對應當前數據庫配置的所有映射關系,同時也負責維護當前的二級數據緩存和Statement Pool。由此可見,SessionFactory的創建過程非常復雜、代價高昂。這也意味着,在系統設計中充分考慮到SessionFactory的重用策略。由於SessionFactory采用了線程安全的設計,可由多個線程並發調用。
Session是Hibernate持久化操作的基礎,提供了眾多持久化方法,如save、update、delete等。通過這些方法,透明地完成對象的增加、刪除、修改、查找等操作。
同時,值得注意的是,HibernateSession的設計是非線程安全的,即一個Session實例同時只可由一個線程使用。同一個Session實例的多線程並發調用將導致難以預知的錯誤。
Session實例由SessionFactory構建:
Configuration config=new Configuration().configure();
SessionFactorysessionFactory=config.buldSessionFactory();
Session session=sessionFactory.openSession();
四、session對象能干什么
在hibernate中的session並不是http中所說的session,一般把HttpSession對象稱為用戶會話。。。
而hibernate中的Session呢?是用來表示,應用程序和數據庫的一次交互(會話)。在這個Session中,包含了一般的持久化方法(CRUD),不要說不知道CRUD是什么
。而且,Session是一個輕量級對象(線程不安全),通常將每個Session實例和一個數據庫事務綁定,也就是每執行一個數據庫事務,都應該先創建一個新的Session實例,在使用Session后,還需要關閉Session。
