Hibernate(二)——POJO對象的操做

    POJO對象其實就是咱們的實體,這篇博客總結一下框架對POJO對象對應數據庫主鍵的生成策略,和一些對POJO對象的簡單增刪改查的操做。 java

   一,Hibernate框架中主鍵的生成策略有三種方式: sql

   1,數據庫負責生成主鍵(代理主鍵) 數據庫

     a,native:表示由設置的方言決定採用什麼數據庫生成主鍵方式,例如:在MySQL中會採用自增加的方式,主鍵字段必須都是整形類型;在Oracle數據庫中,會採用序列的增加方式。 緩存

     b,sequence:表示採用數據庫的序列生成主鍵,適用於OracleDB2數據庫中。 session

     c,identity:表示採用自增加的主鍵生成方式,適用於MySQL,SQL Server中。 框架

  2Hibernate框架負責生成主鍵值(代理主鍵): ide

     a,increment:表示由框架自己提供計數器,累加數據,獲取主鍵。 ui

    b,uuid:由框架根據參數(IP地址,JVM虛擬機啓動時間,系統時間,計數器等)生成3216進制的數字字符串。 spa

  3,用戶提供主鍵值(天然主鍵): 代理

    Assigned:業務(本身)提供主鍵。

  固然這裏經常使用的是native,uuidAssigned三值。在設置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語句。

                  buuid主鍵生成策略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,普通查詢(面向對象查詢):

             1Query

        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的幫助文檔中進行查看參考,會幫助咱們不少的!

相關文章
相關標籤/搜索