Hibernate使用詳解

ORM(Object Relationship Mapping 對象關係映射)

寫SQL的不便之處:

1.不同的數據庫使用的SQL語句不同,如PL/SQL和T/SQL

2.同樣的功能在不同的數據庫中有不同的實現方式,如分頁。

3.程序過分依賴SQL將對程序的移植、拓展和維護帶來極大的不便

Hibernate對JDBC進行了非常輕量化的封裝

在Eclipse上安裝Hibernate Tools插件

使用Hibernate步驟

1.創建Hibernate配置文檔(Hibernate.cfg.xml

2.創建持久化類

3.創建對象-關係映射文件

4.通過Hibernate API編寫訪問數據庫代碼

(準備工作導入Hibernate相關jar包和mysql的jdbc相關jar包)

Hibernate.cfg.xml常用配置

1.hibernate.show_sql是否把Hibernate運行時的sql語句輸出到控制檯

2.hibernate.format_sql輸出到控制檯的sql是否排版,建議設爲true

3.hbm2ddl.auto可以幫助由java代碼生成數據庫腳本,進而生成具體的表結構。create | update | create-drop | validate

//謹慎使用create,因爲會刪除原有表

4.hibernate.default_scheme默認的數據庫

5.hibernate.dialect方言

Session簡介

因爲Hibernate不建議直接使用jdbc的connection操作數據庫,而是通過使用session來操作數據庫

session可以理解爲操作數據庫的對象

session與connection是多對一的關係,每個session都有一個與之對應的connection對象,一個connection不同時刻可以供多個session使用

操作數據庫就需要調用session的各種方法,如save() update() delete() createQuery()等

Transaction(事務)簡介

hibernate對數據庫的操作都是封裝在事務當中的,並且是默認是非自動提交的方式。所以用Session保存對象時,如果不開啓事務,數據是不會寫到數據庫中的

,所以要執行transaction.commit();

Session詳解

如何獲得Session對象?

1.openSession();

2.getCurrentSession();

如果使用的是getCurrentSession需要在hibernate.cfg.xml文件中進行配置:

如果是本地事務(jdbc事務)

<property name = "hibernate.current_session_context_class">thread</property>

如果是全局事務(jta事務)

<property name = "hibernate.current_session_context_class">jta</property>

openSession()與getCurrentSession()的區別:

1.getCurrentSession()在事務提交或回滾之後會自動關閉,openSession()需要手工關閉,如果不關閉,多次連接之後會導致連接池溢出

2.getCurrentSession()使用現有的session對象(單例模式),而openSession()每次創建新的session

hbm配置文件常用設置

單一主鍵

1.assigned 由java應用程序負責生成,即手工賦值

2.native由底層數據庫自動生成標識符,如果是Mysql就是increment,如果是oracle就是sequence,等等

基本類型

對象類型


組件屬性


單表操作:save delete update get/load

get/load 的區別:

1.在不考慮緩存的情況下,get方法是立即發送sql語句,返回持久化對象;load方法返回的是代理對象,該代理對象只保存了實體對象的id

在使用對象的非主鍵屬性時纔會發sql語句

2.get方法在查詢到數據庫不存在的對象時,返回的是null;而load返回的是orh.hibernate.ObjectNotFoundException


單向一對多映射:

1.在一方定義一個多方的集合;

2.創建了相應的類之後,還要創建相應的關係映射文件:XXX.hbm.xml

3.在映射文件中配置各個屬性,以及配置一對多關聯關係。例如一個班級對多個學生:

<set name="students" table="student">

<!--指定關聯的外鍵列-->

<key column="gid"></key>

<one-to-many class="XXX.XXX.XXX.Student"></one-to-many>

</set>

4.在hibernate核心配置文件Hibernate.cfg.xml當中指定映射文件的路徑

<mapping resourse="XXX.XXX.XXX.Grade.hbm.xml">

<mapping resourse="XXX.XXX.XXX.Student.hbm.xml">

5.進行一對多操作時,就相當於對集合操作


單向多對一映射

1.在多方定義一個一方引用;

2.在映射文件中配置多對一關聯關係,如多個學生對一個班級:

<many-to-one name="grade" class="XXX.XXX.XXX.Grade" column="gid"></many-to-one>

3.使用時就在多方中使用一方的引用


雙向多對一映射

1.在一方映射文件中配置一對多關聯關係:

<set name="students" table="student">

<!--指定關聯的外鍵列-->

<key column="gid"></key>

<one-to-many class="XXX.XXX.XXX.Student"></one-to-many>

</set>

與此同時在多方映射文件中配置多對一關聯關係:

<many-to-one name="grade" class="XXX.XXX.XXX.Grade" column="gid"></many-to-one>

2.在代碼中操作時,也要同時一方通過集合設置多方,多方通過引用設置一方

3.爲了性能考慮設置inverse屬性

<set>節點的inverse指定關聯關係的控制方向,默認爲由one方來維護

關聯關係中,inverse = “false”爲主動方,由主動方負責維護關聯關係

在一對多關聯中,只能把one方的inverse設置爲true,則由many方爲主動方

4.如不想在代碼操作時即操作一方又操作多方,則可在<many-to-one> 或 <one-to-many>

設置cascade屬性,此時系統會自動判斷,如:如果給學生關聯班級,沒有該學生,則會自動添加學生


上述學習來自慕課網及網上學習感想。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章