Hibernate學習筆記( 二 ) 核心API介紹

Hibernate的API一共有6個,分別爲:Session、SessionFactory、Transaction、Query、Criteria和Configuration。
         通過這些接口,可以對持久化對象進行存取、事務控制。   詳情請百度.......
============================================================================================
Hibernate 4.0 版本
      在CRUD操作執行完成後,釋放資源階段,如果僅僅是關閉session    進程無法停掉
      還需要關閉會化工廠          SessionFactory.close()
                                  還需要銷燬   StandardServiceRegistry  實例  ssr
                   ===>           StandardServiceRegistryBuilder.destroy(ssr);
================================
    1/提取出公共工具類:
-----------------------------------------------------------
    public class HibernateSessionFactory {
        private final static SessionFactory sessionFactory;
        static {
            try{
                sessionFactory =new Configuration().configure().buildSessionFactory();
            }catch (Exception e) {
                e.printStackTrace();
                throw new ExceptionInInitializerError(e);
            }
        }

        public static Session getCurrentSession () {
            return sessionFactory.getCurrentSession();
        }

        public static Session getOpenSession () {
            return sessionFactory.openSession();
        }
    }
-----------------------------------------------------------
    2/根據主鍵查詢操作
        a/ Object  get(class , id )   若數據不存在返回null
        b/ Object  load(class , id )  若數據不存在返回ObjectNotFoundException
-----------------------------------------------------------
(一) Hibernate 動態更新
    --> 這裏記錄基於API的三種方式進行簡單的更新
        1/ 使用update()方法
           這個方法會直接進行跟新
        2/ 使用load() 方法
        -----------------------------------------------------
         public void  updataUser(User user) {
                try {
                    transaction = HibernateSessionFactory.getCurrentSession().beginTransaction();
                    //加載獲取數據庫中存儲的數據   保存爲一個快照--> 緩存
                    User userToUpdate =  userDao.loadUser(user.getId());
                    // 分別對每個屬性進行賦值 -->  在快照的基礎上進行比對,對發生變化的數據進行更新
                    userToUpdate.setAge(user.getAge());
                    userToUpdate.setName(user.getName());
                    userToUpdate.setPwd(user.getPwd());
                    transaction.commit();
                }catch (Exception e){
                    e.printStackTrace();
                    if (transaction!=null){
                        System.out.println("異常回滾");
                        transaction.rollback();
                    }
                }
            }
        -----------------------------------------------------
        3/ 使用merge方法     動態更新    每次更新前都會進行查詢  類同2, 但不用賦值
-----------------------------------------------------------
(二) 刪除
-----------------------------------------------------------
    1/ 常見異常處理:
    not-null property references a null or transient value : com.bdqn.entity.User.age
    --->  這個異常是因爲:
   <property name="age" column="age" type="java.lang.Integer" length="10" not-null="true"/>
                    ==> hibernate 在進行數據封裝時, 通過xml校驗到 age屬性是null的,而正如上面的
                                  配置,notnull="true", 所以報錯,但是在三層結構中,對於一般的數據
                                  大部分都會在service和web層等做完校驗,二者dao層應當校驗完畢,
                                  dao層處理的數據都應是一個有效數據.
                                  notnull   使用需適當
      2/ 如果主鍵增長策略是assign    則在執行刪除的時候, Hibernate會先進行查詢主鍵是否有效,是否會返回
                                  一個正確有效的對象,然後進行刪除

      -----------------------------------------------------------
         刪除的兩種API方式  : 1  /  通過傳入一個id數據 , 然後調用load/get方法獲取一個對象
                                    調用delete方法刪除對象
                              2  /  通過傳入的id封裝爲一個只含有id屬性的對象,直接調用delete方法刪除,但
                                    此方法使用需要結合xml配置裏的非空驗證
      -----------------------------------------------------------
-----------------------------------------------------------
( 三 ) 三種狀態
      ----------------------------------------------
       狀態          內存         session
       瞬時態          ×            ×
       遊離態          √            ×
       持久態          √            √
       ----------------------------------------------
       髒對象:      執行完查詢或者其他某個操作 , 將遊離態對象轉變成了持久態,最初的時候 Hibernate會給
                    拿到的數據一個快照,在接下來使用過程中很有可能對當前這個對象會做出一些修改,導致數據
                    發生變化,一旦發生變化,這個對象就被成爲了髒對象.
                    =========== >   在hibernate中狀態前後發生改變的對象,稱爲髒對象
       髒檢查;     一旦數據發生變化,Hibernate就回進行髒檢查,一旦發現髒對象,就回執行同步操作,保持和數據庫
                   數據一致
              ===>  髒檢查觸發的時機 :
                            a/ 事務提交    tx.commit()  時觸發
                            b/ 刷新緩存    tx.flush()   時觸發

========================================================================================











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