Welcome to Yumao′s Blog.
Hello Hibernate Day01~Day03
, 2012年06月04日 , Java Language , 评论 在〈Hello Hibernate Day01~Day03〉中留言功能已關閉 ,

最近忙着拿畢業證啊什麼的事情
一次把三天的都丟上好了
順帶說下PDF就不再貼出詳細地址了
因爲主頁就可以直接選擇相應的標題進行瀏覽
PDF主頁爲 http://reader.yumao.name


1.Hibernate基本概念
  1)Hibernate有什麼作用
    a.Hibernate框架主要用於對數據庫操作,是對JDBC的封裝.在應用程序中實現數據訪問層.
    b.Hibernate好處
     a.避免程序員寫大量複雜SQL
     b.SQL移植性較差,Hibernate可以自動生成SQL,移植性強
     c.自動完成數據記錄與Java對象之間的映射

  2)了解Hibernate基本原理--ORM
    Hibernate基於ORM思想的實現. Object Relation Mapping對象關係

.
映射.
    Hibernate可以完成java對象和數據表記錄之間的映射,這樣程序員在業務層只要對這些對象操作,就可以實現對數據庫的操作.
    Hibernate主要構成:
    a.hibernate主配置(數據庫連接參數)
    b.實體類<--映射文件-->數據表

*2.Hibernate基本使用
   1)主要使用步驟
     a.引入hibernate開發包jar
     b.在src下添加hibernate.cfg.xml主配置文件(1個)
        用於定義數據庫連接參數
     c.定義實體類User(n個)
     d.定義映射描述文件User.hbm.xml(n個)
     e.利用Hibernate API完成增刪改查操作

hibernate.cfg.xml---->User.hbm.xml---->User類
修改了hbm.xml的名稱和所在位置,要修改hibernate.cfg.xml的
修改了實體類User的名稱和包路徑,要修改hbm.xml文件的的name屬性
修改了hibernate.cfg.xml的名稱和位置,要修改conf.configural("指定路徑");

   2)基本操作(必須掌握)
    添加 : session.save()
    刪除 : session.delete()
    更新 : session.update()
    findById查詢  session.load()
    findAll查詢 Query query = session.createQuery("from User");
                 List list = query.list();

   3)Hibernate提供的映射類型
     在hbm.xml映射文件中,利用type="映射類型"使用.
主要作用是指定屬性和字段之間的如何進行類型轉換
    *整數:integer,long
    *浮點數:double
    *字符串:string
    *日期時間:date(僅包含年月日),timestamp(包含年月日時分秒)
    *布爾:true_false 完成布爾屬性和T,F字符之間的轉換
          yes_no  完成布爾屬性和Y,N字符之間的轉換
    其他: big_decimal,big_integer,blob,clob
   4)Hibernate提供的主鍵生成方式
  僅對添加操作有意義,在添加時,利用指定的主鍵生成方式獲取主鍵值,寫入數據表.
   *a. identity
    Hibernate利用數據庫自動增長功能,設置主鍵值.要求數據庫得支持,在設計表時,設置自動增長功能.例如MySQL,SQLServer
   *b. sequence
    Hibernate利用指定的sequence對象,獲取nextval,將該值作為主鍵值.
適用於Oracle
  
	
              user_seq
           
  
   *c. native
     Hibernate會根據方言類型不同,自動選擇主鍵生成方式.如果是MySQLDialect會選擇identity;如果是OracleDialect會選擇sequence

   *d. increment
     Hibernate會先執行select max(id) from table ,之後將最大值+1作為主鍵值.

   *e. assigned
     Hibernate忽略主鍵的管理,需要程序員在程序中指定設置id值.
   f. 其他
     hilo:基於高低位算法生成id值
     uuid:基於uuid算法生成id值

1.Hibernate框架的特性
  1)一級緩存(默認啟用)
   session對象級別的緩存,利用該session取出的對象會放到緩存中.在後續查詢時,首先去緩存中尋找,沒有再去數據庫尋找.
   session緩存區在session關閉後銷毀.session複雜維護緩存區中對象的狀態.
   在使用時,為了更好發揮一級緩存,需要保障同一個線程處理中,使用同一個Session對象.
    a.使用ThreadLocal對SessionUtil進行改造,將Session對象與ThreadLocal綁定.
    b.Hibernate3之後的新版本,可以使用以下方法
      首先在hibernate.cfg.xml中添加配置
      
	thread
      
      之後使用sessionFactory.getCurrentSession()方法獲取Session
    注意:在使用此session時,必須將session操作封裝在一個transaction

    一級緩存的管理:
     session.evict(obj);將obj對象從當前session的一級緩存中清除.
     session.clear():清除當前session的一級緩存.

  2)延遲加載
    當獲取一個實體對象後,實體對象並沒有立刻發送SQL語句,去數據庫加載數據.而是在調用對象的getXXX()方法時採取加載數據.
    支持延遲加載的方法:session.load(),query.iterator().延遲加載方法返回的對象類型,是動態代理類型.
    session.get()和session.load()方法功能是按主鍵做條件查詢數據,區別
如下:
    a.get()方法不支持延遲加載,load()方法支持
    b.如果數據表中沒有符合的記錄,get()方法返回null,load()拋異常
    c.如果數據表中有符合的記錄,get()返回的是實體類型對象,load()返回的是動態代理類型對象.

    在使用時,需要注意以下事項:
      a.使用延遲加載的API後,避免過早的關閉Session.
LazyInitializationException: could not initialize proxy - no Session
      b.根據需要選擇延遲加載和非延遲加載API
-----------------了解----------------------
   Hibernate延遲加載機制:利用動態生成代理類型機制生成一個動態代理類,並重寫對象的getXXX()方法,當調用get方法時,觸發SQL查詢,去數據庫加載數據.
   Hibernate動態生成代理類型機制:
   以前編寫程序:
     a.編寫一個類源碼
     b.調用編譯器將源碼編譯成class字節碼
     c.類加載器將字節碼文件載入虛擬機內容
     d.虛擬機調用字節碼文件的方法,解釋運行
   Session.load()等延遲方法返回的類型是Foo$Enhancer$CGLIB....,
這些類型是Hibernate框架利用程序在內容中動態生成並編譯的類型.
上述功能,是Hibernate調用asm.jar,cglib-2.1.3.jar工具包完成的.
   asm.jar主要用於在內存中動態和編譯生成一個類
   cglib.jar是基於asm.jar,對其擴展,在內存中生成一個代理類型.該代理類是原類型的一個子類.

  3)Hibernate中對象的狀態
    在Hibernate使用中,對象的狀態有以下三種
    a.臨時對象 : 在程序中使用new方式創建的對象
    b.持久對象 : 在程序中與session對象關聯,由session負責管理的對象.
                   處於session緩存中的對象都是持久對象
                   對象的持久性:指的是對象的數據狀態在事務提交時可                     以與數據庫保持同步更新.
             session.flush();//將持久對象與數據庫同步
             tx.commit();//事務提交,提交前默認也調用session.flush()
    c.託管對象 : 在程序中如果session.close()後,session負責管理的持久                   對象將成為託管對象.
   垃圾回收器負責回收臨時和託管狀態,持久狀態不能回收.

1.在映射對象之間建立一對多關係one-to-many
  1)在一的一方的類中添加集合屬性Set
  2)在一的一方的映射文件中添加映射


    
    

  3)使用時,通過對象的getXXX方法獲取

2.在映射對象之間建立多對一關係many-to-one
   1)在多的一方的類中添加一方類型的屬性
     去掉關聯字段的屬性
   2)在多的一方的映射文件中添加映射




     去掉原有關聯字段的映射

   3)使用時,通過對象的getXXX方法獲取

Code Package:Hibernate_1-3.tar

关键字:, , , , ,

评论已关闭