<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Kela's Blog

                前面的路很坎坷,但畢竟是條路.也許走過這一段就會發現,走過去就是夢想中的地方.因此堅持成為此刻唯一能做且必須去做的事情.
    posts - 9, comments - 27, trackbacks - 0, articles - 15

    kela的筆記 ORM產品 ---- hibernate(3)

    Posted on 2005-11-22 13:02 Kela 閱讀(2358) 評論(2)  編輯  收藏 所屬分類: 我的筆記(Hibernate)

    一個Hibernate版本的“Hello World”

    1. 搭建環境
         建立項目:名稱為HibernateProject,如下圖:
         hb001.BMP
          下載Hibernate發行包:
           這里使用 Hibernate3.X ,因為 Hibernate 在3.X 上性能有了更大的提升。(也可以采用 2. X的版本,3.X 和 2.X 之間的差異不多,這里的“不多”是從使用者的角度來看,在需要注意的地方,會注明,另附 3.X 和 2.X 差異表一張)
          下載地址:http://www.hibernate.org 在 http://www.redsaga.com 的努力之下,Hibernate 的官方發行包中( doc\reference 下),始終有高質量的中文官方文檔,非常的感謝他們。
          在ClassPath 中設置系統開發需要的類庫:
          在項目的lib目錄下添加以下類包( .jar) 文件,并且將這些 .jar 指定在系統 ClassPath 中。(總之,無論在哪種環境中都必須保證系統能找到我們設置的 .jar 。
            a.數據庫驅動程序
               數據庫使用 MS SQL SERVER ,以下是MS 的 JDBC 驅動。( MS 的 JDBC 驅動不是 Hibernate 官方的推薦驅動,在實際的項目中,朋友們可以根據 Hibernate  開發文檔中的配置說明進行取舍)   
               msbase.jar,  mssqlserver.jar, msutil.jar
            b.Hibernate 3.X 的類庫
               將發行包下的 hibernate3.jar 文件復制到 項目(HibernateProject)的 lib 目錄下。
            c.Hibernate需要的第三方類庫
               將發行包下 lib 目錄下的 .jar 文件復制到項目(HibernateProject)的 lib 目錄下。
               需要注意的是,我們這里將全部的 .jar 放在了lib中,在實際的開發中可以根據文檔配置的說明,進行選擇。
           
    2. 建立數據庫
        數據庫名稱:hbdb
    create database hbdb;
        數據表名稱:KELA_STUDENT  
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KELA_STUDENT]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[KELA_STUDENT]
    GO

    CREATE TABLE [dbo].[KELA_STUDENT] (
     [StuID] [varchar] (32) COLLATE Chinese_PRC_CI_AS NOT NULL ,        -- PK
     [StuName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,            --學生姓名
     [StuSex] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,                      --學生性別
     [StuAge] [smallint] NULL ,                                                                             --學生年齡
     [StuAddress] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL         --學生地址
    ) ON [PRIMARY]
    GO

    3. 將 發行包下 ehcache.xml 文件復制到 src 下 
        在Hibernate3中, 如果沒有這個文件會出現
            WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in
             the classpath: jar:file:/D:/J2eeProject/HibernateProject/lib/ehcache-1.1.jar!/ehcache-failsafe.xml
            的錯誤。
        該文件為 Hibernate 的本身的 Cache 配置。
    4. Hibernate 配置
        Hibernate 配置文件主要用于配置數據庫連接和Hibernate運行時所需要的各種屬性(如,連接池,SQL方言,是否現實SQL日志等)。
        Hibernate 同時支持 xml 格式的配置文件各傳統的 properties 文件配置形式,這里采用 xml 。
        配置文件名默認為 hibernate.cfg.xml(或 hibernage.properties),Hibernate在初始化期間自動在 classPath中尋找這個文件,并讀取其中的配置信息,并加載。
        以下是 hibernate.cfg.xml 文件(在項目 HibernateProject 的src 下放以下內容):
    <?xml version="1.0" encoding="GB2312"?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "

    <hibernate-configuration>
     <session-factory>
      
      <!-- 是否將運行期生成的SQL輸出到日志以供調試 -->
      <property name="hibernate.show_sql">
       true
      </property>
      
      <!-- SQL 方言-->
      <property name="hibernate.dialect">
       org.hibernate.dialect.SQLServerDialect
      </property>
      
      <!-- 數據庫用戶 -->
      <property name="hibernate.connection.username">
       sa
      </property>
      
      <!-- 數據庫密碼 -->
      <property name="hibernate.connection.password">
       123456
      </property>
      
      <!-- 數據庫 JDBC 驅動-->
       <property name="hibernate.connection.driver_class">
       com.microsoft.jdbc.sqlserver.SQLServerDriver
      </property>
      
      <!-- 數據庫 URL -->
      <property name="hibernate.connection.url">
       jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hbdb
      </property>
      
      <!-- 事務管理類型 -->
      <!-- Hibernate 3 對包名做了修改 ( net.sf.hibernate  => org.hibernate )-->
      <property name="hibernate.transaction.factory_class">
       org.hibernate.transaction.JDBCTransactionFactory
      </property>
      
      <!-- c3p0 連接池 -->
      <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
      <property name="hibernate.c3p0.max_size">2</property>
      <property name="hibernate.c3p0.min_size">2</property>
      <property name="hibernate.c3p0.timeout">50000</property>
      <property name="hibernate.c3p0.max_statements">100</property>
      <property name="hibernate.c3p0.idle_test_period">3000</property>
      <property name="hibernate.c3p0.acquire_increment">2</property>
      <property name="hibernate.c3p0.validate">false</property>
     
      
      <!-- 映射的配置文件,對應數據庫表 KELA_STUDENT 的映射文件,在后面將看到這個文件的配置 -->
      <mapping resource="com/kela/hb/pojo/KelaStudent.hbm.xml"/>
     </session-factory>
    </hibernate-configuration>

    5. 日志配置
    在Hibernate發行包的etc目錄下找到 log4j.properties 示例配置文件,可以修改其中的日志級別,也可直接使用。
    在src下,放置 log4j.properties 文件,內容如下:
    # log4j #
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

    log4j.rootLogger=warn, stdout

    #設置顯示 error以上級別log
    log4j.logger.org.hibernate=error 

    6. 構建 POJO 類和Hibernate映射( .hbm.xml)文件
            說明:根據數據庫定義導出表結構,并自動生成對應的映射文件和POJO java代碼,是實際開發當中最常用的方式,也是專家所推薦的??梢允褂?MiddleGen -- Hibernate,Hibernate -- Extensions 等的工具,這些工具的使用非常的方便,只修修改相應的 ant 構建文件即可,在網絡上可以很容易的找到這些工具的使用方法。
            這里采用手工編寫 POJO 和映射文件的方法,是基于開發者更好理解 Hibernate 運作機制而考慮。付出手工編寫會產生疏漏和錯誤的代價,我覺得在學習階段是值得的。
          以下是這兩個文件,他們的位置都在   com.kela.hb.pojo 下面。
    POJO類:com.kela.hb.pojo.KelaStudent
     /**
      * KelaStudent.java
      */
    package com.kela.hb.pojo;

    import java.io.Serializable;

    public class KelaStudent implements Serializable {

     private static final long serialVersionUID = 8365163573354176897L;
     
     String stuID;
     String stuName;
     String stuSex;
     Integer stuAge;
     String stuAddress;
     
     public KelaStudent() {
      
     }

     public String getStuAddress() {
      return stuAddress;
     }

     public void setStuAddress(String stuAddress) {
      this.stuAddress = stuAddress;
     }

     public Integer getStuAge() {
      return stuAge;
     }

     public void setStuAge(Integer stuAge) {
      this.stuAge = stuAge;
     }

     public String getStuID() {
      return stuID;
     }

     public void setStuID(String stuID) {
      this.stuID = stuID;
     }

     public String getStuName() {
      return stuName;
     }

     public void setStuName(String stuName) {
      this.stuName = stuName;
     }

     public String getStuSex() {
      return stuSex;
     }

     public void setStuSex(String stuSex) {
      this.stuSex = stuSex;
     }
    }

    映射文件:KelaStudent.hbm.xml
    <?xml version="1.0" encoding="GB2312"?>
    <!DOCTYPE hibernate-mapping
        PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "

    <hibernate-mapping>
     
     <class name="com.kela.hb.pojo.KelaStudent" table="KELA_STUDENT">
      
      <!-- id 節點配置了表的主鍵-->
      <id
       name="stuID"                  //POJO類指的ID
       column="StuID"              //數據庫中的主鍵名稱
       type="java.lang.String"    //字符類型
      >
        <generator class="uuid.hex"/>   //這里的uuid.hex代表了一種主鍵的生成方式
      </id>
      
       <property
            name="stuName"       //POJO中的屬性
          column="StuName"     //屬性對應數據庫字段的名稱
          type="java.lang.String" //屬性類型
         />
      
      <property
          name="stuSex"
          column="StuSex"
          type="java.lang.String"
         />
      
      <property
          name="stuAge"
          column="StuAge"
          type="java.lang.Integer"
         />
      
      <property
          name="stuAddress"
          column="StuAddress"
          type="java.lang.String"
         />
      
     </class>
    </hibernate-mapping>

    7. 測試代碼
    HelloTest  . java

    package com.kela.test;

    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.Transaction;

    import com.kela.hb.pojo.KelaStudent;
    import com.kela.hb.util.HibernateUtil;

    public class HelloTest {

        Session session = null;
     
         public void testInsert() {

            Transaction tran = null;

            try {

               //從  HibernateUtil 得到 hibernate的session,  HibernateUtil .java 文件在后
               session = HibernateUtil.currentSession();
               //啟動事務
               tran = session.beginTransaction();
       
               KelaStudent kelaStudent = new KelaStudent();
               //插入數據
               kelaStudent.setStuName("王小二");
               kelaStudent.setStuSex("T");
               kelaStudent.setStuAge(new Integer(26));
               kelaStudent.setStuAddress("甘肅蘭州");
              
               //保存并提交事務
               session.save(kelaStudent);
               session.flush();
               tran.commit();
       
            } catch (HibernateException he){
       
               System.out.println("運行中發生了錯誤");
               try {
                   HibernateUtil.closeSession();
               } catch (HibernateException he2) {
                   System.out.println("關閉 session 沒有成功");
               }
            }
     
        }
     
        public static void main(String[] args) {
            System.out.println(" ========= 開始測試 ==========");
            HelloTest helloTest = new HelloTest();
            helloTest.testInsert();
            System.out.println(" ========= SUCCESS ==========");
        }

    }

    下面是 HibernateUtil  . java
    /**
     * HibernateUtil.java
     */
    package com.kela.hb.util;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;

    public class HibernateUtil {

       private static Log log = LogFactory.getLog(HibernateUtil.class);

       private static final SessionFactory sessionFactory;

       static {
           try {
               sessionFactory = new Configuration().configure().buildSessionFactory();
           } catch (Throwable ex) {
               log.error("初始化 SessionFactory 發生錯誤.", ex);
               throw new ExceptionInInitializerError(ex);
           }
        }

         public static final ThreadLocal session = new ThreadLocal();

         public static Session currentSession() {
             Session s = (Session) session.get();
             if (s == null) {
                s = sessionFactory.openSession();
                session.set(s);
            }
         return s;
        }

        public static void closeSession() {
            Session s = (Session) session.get();
            if (s != null)
               s.close();
            session.set(null);
        }

    }

    8. 運行結果
        運行 HelloTest.java 文件,觀察數據庫中的結果,可以看到一條數據被添加了進來。

       數據庫結果:
       402880fc07c68f690107c68f6dfd0001          王小二         T         26         甘肅蘭州
       
       在控制臺看到如下日志:
        Hibernate:
        insert into KELA_STUDENT (StuName, StuSex, StuAge, StuAddress, StuID) values (?, ?, ?, ?, ?)
      
        就是這么神奇。不需要指定 SQL 語句一樣能實現SQL的功能。

    9. 關于測試代碼的解釋
        在Hibernate中session完成持久化操作,要創建一個Session實例大致需要3個步驟:
        A. 初始化Hibernate配置管理類Configuration

             //讀入默認的配置文件(hibernate.cfg.xml 或 hibernate.properties)來創建一個Configuration
             Configuration config = new Configuration().configure();  
        B. 通過Configuration類的實例來創建 Session 的工廠類 SessionFactory:
            
             SessionFactory sessionFactory = config.buildSessionFactory();

        C. 通過SessionFactory得到Session實例:
      
             session = sessionFactory.openSession();

        D. 通過Session實例完成持久化操作:

               //啟動事務
               tran = session.beginTransaction();
       
               KelaStudent kelaStudent = new KelaStudent();
               //插入數據
               kelaStudent.setStuName("王小二");
               kelaStudent.setStuSex("T");
               kelaStudent.setStuAge(new Integer(26));
               kelaStudent.setStuAddress("甘肅蘭州");
              
               //保存并提交事務
               session.save(kelaStudent);
               session.flush();
               tran.commit();

          說明:由于SessionFactory采取了線程安全的設計,可以有多個線程并發調用,大多數情況下,一個應用中針對一個數據庫共享一個SessionFactory實例即可。
                      Session(這里的Session是Hibernate的Session)可以理解成相當于JDBC 的Connection),它的設計是非線程安全的也就是說一個Session實例只可以由一個線程使用。
                      有了以上兩點的考慮,在 HelloTest.java中在得到Session實例使用了:

               //從  HibernateUtil 得到 hibernate的session,  HibernateUtil .java 文件在后
               session = HibernateUtil.currentSession();

              
               在HibernateUtil.java 文件中創建Session,關閉Session。(這段代碼來自于Hibernate文檔)
               這就相當于我們平時從數據庫連接池中得到 Connection,用完了 close.conn() 是一樣的道理。

        

    Feedback

    # re: kela的筆記 ORM產品 ---- hibernate(3)  回復  更多評論   

    2005-11-23 16:31 by
    封裝一個hibernate的DAO調用模版,就像spring的HibernateDaoSupport一樣,這樣,代碼就會優美很多,樓主有時間的話實現一個。

    # re: kela的筆記 ORM產品 ---- hibernate(3)  回復  更多評論   

    2005-11-23 16:33 by brother
    同樣,可以利用callback實現自己的aop,也建議你嘗試一下。
    分享到:
    主站蜘蛛池模板: 亚洲国产成人乱码精品女人久久久不卡 | 黄网站色视频免费在线观看的a站最新| 成年私人影院免费视频网站| 亚洲成a人片在线观看中文!!!| 91精品免费观看| 精品亚洲国产成AV人片传媒| 精品熟女少妇av免费久久| 久久精品九九亚洲精品| 亚洲精品视频在线观看免费| 亚洲一级毛片免费在线观看| 在线v片免费观看视频| 亚洲噜噜噜噜噜影院在线播放| 可以免费看的卡一卡二| 一区二区亚洲精品精华液| 日本免费一区二区三区最新 | 美女露100%胸无遮挡免费观看| 性做久久久久免费看| 人妻仑刮八A级毛片免费看| 久久久久亚洲AV无码专区网站 | 免费黄色电影在线观看| 亚洲色偷偷偷网站色偷一区| 久久不见久久见中文字幕免费| 国产精品亚洲一区二区在线观看| 免费一级特黄特色大片在线观看| 国产精品福利在线观看免费不卡| 国产亚洲av片在线观看播放| 最近免费最新高清中文字幕韩国| 亚洲六月丁香六月婷婷蜜芽| 在线观看国产情趣免费视频 | 91精品免费久久久久久久久| 亚洲成年网站在线观看| 免费乱码中文字幕网站| 久久国产乱子伦精品免费强| 亚洲综合偷自成人网第页色| 亚洲国产精品人人做人人爱| 久久精品免费观看国产| 亚洲av无码av在线播放| 亚洲高清在线播放| 永久黄网站色视频免费| 香蕉成人免费看片视频app下载| 亚洲熟妇成人精品一区|