1. 程式人生 > >hibernate 學習筆記1

hibernate 學習筆記1

Hibernate session1

1.連線池的最小連線數指的是連線池初始化之後,就存在的連線數,這些連線放在記憶體中,等待被使用。最大連線數限定了連線池中最大同時連線數量,如果超過了這個數量,則進入等待佇列中,需要等其他連線退出之後,才能進行連線。

2.自動建表功能有create-drop,create,update和validate四種:

1)create-dtrop是:drop->create->drop;

2) create是:drop->create

3)update是:先比較表的結構,如果表的結構發生變化,則:drop-create,否則不進行ddl操作;

4)validate是:驗證java物件與資料庫表的一致性,如果不一致,則報錯。

5)SessionFactory不僅是一個數據庫連線池,而且還儲存了相應的資料庫配置資訊以及ORM、預定義的SQL語句。同時,還維護了hibernate的二級快取。SessionFactory是重量級的物件,一個數據庫只需要一個SessionFactory且最好在應用啟動的時候完成他的初始化,SessionFactory是執行緒安全的。

3.Session是hibernate中使用最為頻繁的API,可以再一次資料庫操作中,就使用一個Session,使用完之後立即關閉,就像Servlet的一次請求相應一樣,用完就釋放。Session是執行緒不安全的,Session物件有一個一級快取,顯式執行flush之前,快取是不會提交到資料庫中的。Session的常用方法有以下幾個,這些方法對應了資料庫的增刪改查:

1)  save(obj) ----儲存資料

2)  get(Class,id) ----通過主鍵查詢該條記錄

3)  delete(obj)  ---刪除資料,注意,為了方便和準確,刪除的資料一般都是先查詢出來的資料。

4)  update(obj)  ---更新資料,注意,為了方便和準確,更新的資料一般都是先查詢出來的資料。

5)  saveOrUpdate(obj)  ---儲存或修改資料

6)createQuery(String hql)   ---查詢所有的資料

4.HQL就是hibernate中類似於sql的查詢語句,是面向物件的。完整的HQL語句形式如下: Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc 其中的update/delete為Hibernate3中所新新增的功能,可見HQL查詢非常類似於標準SQL查詢。由於HQL查詢在整個Hibernate實體操作體系中的核心地位.

5.Transaction就是資料庫的事物,用於滿足ACID,提供了兩個方法來實現提交或回滾操作:

1) commit()  ---提交事務。在無異常時,直接提交,

2) rollback()  ---回滾事務。一般是用在catch到異常之後,事務回滾。

Hibernate預設不開啟自動提交,而是使用者通過Transaction介面手動提交事務

如果沒有開啟事務,那麼每個session的操作都是一個獨立事務,即每一條sql語句都是一個事務。

6.自然主鍵指的是有實際意義的主鍵,不如身份證號碼。自然主鍵可能會在以後變得不唯一,比如以後因為有人去去世有人新生,有一天身份證號碼不唯一了,那麼資料庫就會失效了,所以一般使用代理主鍵。

7.主鍵的生成策略:

1)increment:適用於short,int,龍作為主鍵,不是使用資料庫的自動增長機制,而是hibernate來維護的。

  * hibernate中提供的一種增長機制:

  **先查詢 : select max(id)  from person

  **再進行插入 :取得的最大值+1最為新紀錄的主鍵

  *缺點:不能再叢集和併發中使用。所以不常用

2)identity:適用於short,int,long作為主鍵,但是這個必須使用在有自動增長功能的資料庫中(支援auto_increment),採用的是資料庫底層的自動增長機制。

3)sequence:適用於short,int,long作為主鍵,底層採用的是序列的增長方式,需要制定序列。

4)UUID:適用於char,varchar型別作為主鍵,使用框架隨機產生的32位字串作為主鍵。適合多執行緒。

5)native:本地策略,適用於short,int,long作為主鍵,根據底層資料庫的不同,自動選擇適用於該種資料庫的主鍵生成策略。

   *如果底層使用的是Mysql資料庫,則相當於identity;

   *如果底層使用的是不支援auto_increment的oracle資料庫,則相當於sequence。

6)assigned:自然主鍵,使用者自己管理,而不是由hibernate管理。

注意:native和identity不僅需要資料庫支援auto_increment,還要欄位已經開啟了AUTO_INCREMENT。

8.屬性欄位儘量使用包裝類而不是基礎型別,這樣,當沒有set相應的值得時候,值為Null而不是基本型別的預設值。這樣做的好處就是可以對應資料庫的null值,從而區分是一個具體的值還是缺失值。比如一個學生的成績,如果他沒有參加考試,則是Null,如果分值為0,則說明他考試了,但是考了0分。

9.持久化的java部分是:java bean+ Classname.hbm.xml

10. useUnicode=true&characterEncoding=UTF-8,&要用實體類&  這裡的characterEncoding同時設定了character_set_client和character_set_results環境變數。