POJO對象其實就是咱們的實體,這篇博客總結一下框架對POJO對象對應數據庫主鍵的生成策略,和一些對POJO對象的簡單增刪改查的操做。 java
一,Hibernate框架中主鍵的生成策略有三種方式: sql
1,數據庫負責生成主鍵(代理主鍵) 數據庫
a,native:表示由設置的方言決定採用什麼數據庫生成主鍵方式,例如:在MySQL中會採用自增加的方式,主鍵字段必須都是整形類型;在Oracle數據庫中,會採用序列的增加方式。 緩存
b,sequence:表示採用數據庫的序列生成主鍵,適用於Oracle,DB2數據庫中。 session
c,identity:表示採用自增加的主鍵生成方式,適用於MySQL,SQL Server中。 框架
2,Hibernate框架負責生成主鍵值(代理主鍵): ide
a,increment:表示由框架自己提供計數器,累加數據,獲取主鍵。 ui
b,uuid:由框架根據參數(IP地址,JVM虛擬機啓動時間,系統時間,計數器等)生成32位16進制的數字字符串。 spa
3,用戶提供主鍵值(天然主鍵): 代理
Assigned:業務(本身)提供主鍵。
固然這裏經常使用的是native,uuid和Assigned三值。在設置POJO類與表映射時,進行主鍵設置,標籤爲<id>,在其中的<generator>標籤中進行設置,例如:
<!-- id標籤用來映射主鍵字段 name屬性表示類的屬性 column屬性表示表的字段 --> <id name="usercode" column="usercode" length="32" type="java.lang.String"> <!-- 主鍵生成策略 --> <generator class="assigned"/> </id>
二,Hibernate框架下的POJO對象的三種狀態:
1,瞬時狀態(臨時狀態):Transient Object
對象和數據庫的數據沒有關聯,而且沒有和框架關聯在一塊兒。例如,咱們剛剛 new User();
2,持久化狀態:Persistent Object
對象和數據庫的數據存在關聯,而且和框架關聯在一塊兒。例如咱們剛剛進行保存的 session.sava(user);
3,遊離狀態(離線狀態,託管狀態)Detached Object
對象和數據庫的數據存在關聯,可是和框架沒有關聯。例如保存後session關閉的user。
看一下三種狀態POJO對象的轉換吧:
三,Hibernate,對三種狀態下的POJO的增刪改查操做:
|
瞬時狀態 |
持久化狀態 |
遊離狀態 |
增(Save) |
能夠 |
不能夠(不必) |
不能夠(不必) |
改(Update) |
不能夠 |
修改後會自動更新,不需手動 |
能夠 |
刪(delete) |
不能夠 |
能夠 |
能夠 |
查 |
不能夠 |
能夠 |
能夠 |
1,保存(Save):
經過session.save(user);就能夠保存數據了,可是這裏想提一下,主鍵的生成策略不一樣,框架發送sql語句的時間是不一樣的:
a,native:在調用save方法時發送insert語句。
b,uuid主鍵生成策略和assigned主鍵生成策略:在提交事務時發送insert語句。
這是由於主鍵的生成時機不一樣,因爲native是在數據庫中生成的,因此發送的比較早。
2,更新(Update):
這裏想說一下對遊離對象的更新:
|
uuid |
assigned |
native |
存在記錄 |
發送upate語句 |
會查詢判斷,再更新 |
發送update語句 |
記錄不存在 |
發送語句,剖異常 |
會查詢判斷,進行插入操做 |
發送語句,剖異常 |
3,刪除(delete):
這裏只要提供主鍵,能夠根據主鍵id刪除,只要id存在便可。
4,查詢:
a,主鍵查詢:
get:返回結果多是:持久化對象或null,因此須要對結果進行非空判斷。它利用了緩存,是當即查詢。
Objectobj = session.get(User.class, "admin"); //get方法查詢若是成功,那麼返回的對象狀態是持久化狀態
load:返回結果多是:持久化對象或cglib代理對象或異常,利用緩存,默認爲延遲加載。
Objectobj = session.load(User.class, "admin");//load方法第一查詢結果存放到緩存中,支持延遲加載,效率更高。
b,普通查詢(面向對象查詢):
1,Query:
HQL (HibernateQuery Language),HQL語言是對SQL語言的封裝,是面向對象的查詢語言。例如:
SQL : select * from t_user(表名) where username(字段)="tom"
HQL : from User(類名) where username(屬性)="tom"
//分頁查詢 String hql = "from User u "; //面向對象查詢 Query query = session.createQuery(hql); int pageno = 3 ; int pagesize = 2 ; int index = (pageno - 1) * pagesize ; query.setFirstResult(index);//某頁的第一個下標 query.setMaxResults(pagesize); //頁數的大小
//條件查詢 String hql = "from User u where u.usercode=? and u.userpswd=?"; //面向對象查詢 HQL!!!!! Query query = session.createQuery(hql); query.setString(0, "admin"); //索引從0開始 query.setString(1, "admin");
2, Criteria:將全部的操做都以面向對象的方式進行完成。
Criteria cra = session.createCriteria(User.class); cra.setFirstResult(0); //開始索引 cra.setMaxResults(2); //每頁數量 //排序 Criteria cra = session.createCriteria(User.class); cra.addOrder(Order.desc("username")); //條件查詢 Criteria cra = session.createCriteria(User.class); cra.add(Restrictions.eq("username", "aaa")); cra.add(Restrictions.eq("usercode", "aaa"));
綜上爲Hibernate對POJO對象的簡單操做,主要是作好映射,簡單的配置,而後利用Hibernate裏邊的方法進行配置。這裏這是舉了幾個簡單的例子涉及的知識較少,咱們能夠查看Hibernate的幫助文檔中進行查看參考,會幫助咱們不少的!