posts - 431,  comments - 344,  trackbacks - 0

          Hibernate.cfg.xml 配置文件:
          <?xml version="1.0" encoding="utf-8"?>
          <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "hibernate-configuration-2.0.dtd">
          <hibernate-configuration>
              <session-factory>
                  <!-- properties -->
                  <!-- jndi -->
                  <property name="connection.datasource">java:comp/env/jdbc/quickstart</property>
                  <property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property>
                  <property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
                  <!-- jdbc
                  <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs</property>
                  <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
                  <property name="connection.username">sa</property>
                  <property name="connection.password"></property>
                   -->
                  <property name="jdbc.fetch_size">50</property><!--
          一次讀的數(shù)據(jù)庫記錄數(shù) -->
                  <property name="jdbc.batch_size">30</property><!--
          設(shè)定對(duì)數(shù)據(jù)庫進(jìn)行批量刪除
          -->
                  <property name="show_sql">true</property><!--
          Hibernate 發(fā)送給數(shù)據(jù)庫的 sql 顯示出來
          -->
                  <!-- Mapping files -->
                  <mapping resource="cat.hbm.xml"/>
              </session-factory>
          </hibernate-configuration>

          數(shù)據(jù)庫表主鍵的知識(shí)點(diǎn):
          Generator
          為每個(gè) POJO 的實(shí)例提供唯一標(biāo)識(shí)。一般情況,我們使用“ native ”。 class 表示采用由生成器接口 net.sf.hibernate.id.IdentifierGenerator 實(shí)現(xiàn)的某個(gè)實(shí)例,其中包括:

          assigned
          主鍵由外部程序負(fù)責(zé)生成,在 save() 之前指定一個(gè)。

          hilo
          通過 hi/lo 算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要額外的數(shù)據(jù)庫表或字段提供高位值來源。

          seqhilo
          hilo 類似,通過 hi/lo 算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要數(shù)據(jù)庫中的 Sequence ,適用于支持 Sequence 的數(shù)據(jù)庫,如 Oracle 。

          increment
          主鍵按數(shù)值順序遞增。此方式的實(shí)現(xiàn)機(jī)制為在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存著當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?/span> 1 作為主鍵。這種方式可能產(chǎn)生的問題是:不能在集群下使用。

          identity
          采用數(shù)據(jù)庫提供的主鍵生成機(jī)制。如 DB2 、 SQL Server 、 MySQL 中的主鍵生成機(jī)制。

          sequence
          采用數(shù)據(jù)庫提供的 sequence 機(jī)制生成主鍵。如 Oralce 中的 Sequence 。

          native
          Hibernate 根據(jù)使用的數(shù)據(jù)庫自行判斷采用 identity hilo sequence 其中一種作為主鍵生成方式。

          uuid.hex
          Hibernate 基于 128 UUID 算法 生成 16 進(jìn)制數(shù)值(編碼后以長度 32 的字符串表示)作為主鍵。

          uuid.string
          uuid.hex 類似,只是生成的主鍵未進(jìn)行編碼(長度 16 ),不能應(yīng)用在 PostgreSQL 數(shù)據(jù)庫中。

          foreign
          使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符作為主鍵。

          以下舉例:
          1
          、指定參數(shù)的情況:
              <id name="id" unsaved-value="0">
                <generator class="sequence">
                  <param name="sequence">SEQ_CHILD</param>
                </generator>
          </id>
          使用的是 sequence ,適合 oracle 數(shù)據(jù)庫;

          2 、對(duì)于 sql server2000 中的數(shù)據(jù)庫子增字段 , 在配置文件使用下列方法實(shí)現(xiàn):
          <id name="id" type="long" unsaved-value="0">
               <column name="id" sql-type="numeric" not-null="true" />
               <generator class="identity" />
          </id>
          這里主要是 :identity: 代表由 sql server2000 數(shù)據(jù)庫自己提供子增字段 . 如果要 hibernate 自己提供 , 則用 increment 關(guān)鍵字來實(shí)現(xiàn)

          3 、如果表中的主鍵用字符串類型 : 可以用 hibernate 自己提供的方法實(shí)現(xiàn)主鍵唯一 :
            <id name="id" type="string" unsaved-value="null">
                <column name="cid" sql-type="char(32)" not-null="true" />
                <generator class="uuid.hex" />
            </id>
          使用的是 uuid.hex: 采用 128 位的算法來生成一個(gè) 32 位字符串。最通用的一種方式。適用于所有數(shù)據(jù)庫。

          重要的知識(shí)點(diǎn) :
          1.
          如果有部門表 , 有員工表 , 員工表中有 dep_id, 則表部門類和員工類是 one-to-many 的關(guān)系
          :
            
          可以使用 :  ( 在部門類 department 中使用下列
          )
             Department

               /** 
          部門的所有員工
             */
              private Set staffs = new TreeSet();
             
              xml
          的文件
          :
                <set name="staffs" >
                    <key column="dep_id"/>
                    <one-to-many class="hbp.sys.data.Staff"/>
                </set>
               
          如果是 list, 需要用索引 <index> </index>, 具體其中的含義 , 不是很明白 . 待以后研究

               
           2.
          如果部門要有一個(gè)負(fù)責(zé)人 , 即部門表 (tb_department) 中有一個(gè)字段 :staff_id.
              
          那么表示部門和負(fù)責(zé)人之間的關(guān)系是 many-to-one 的關(guān)系

               Department
          :
                /**
          部門負(fù)責(zé)人
          id */
              private Staff staff;
             
              xml
          文件

               <many-to-one name="staff" class="hbp.sys.data.Staff"  column="staff_id"/> 
           
           3.
          多對(duì)多關(guān)系 , 一般我們是做一個(gè)中間關(guān)聯(lián)表 . 我用角色和權(quán)限做了個(gè)例子 ,
                Right(id,name)     Role(id,name)  
          中間表
          :tb_role_right(role_id,right_id)
                Right
          類中有一個(gè) Role 的集合
          :private Set roles=new TreeSet();
                Role
          類中也有一個(gè) Right 的集合
          :private Set rights=new TreeSet();
               
          則兩者是明顯的多對(duì)多關(guān)系 . 使用 many-to-many 來實(shí)現(xiàn)
          ;
                xml
          文件中

                right.hbm.xml:
          如下 :
                  <set name="roles" table="tb_role_right" cascade="all">
                     <key column="right_id"/>
                     <many-to-many column="role_id" class="hbp.sys.data.Role"/>
                  </set>
                role.hbm.xml
          文件中類似
          :
                  <set name="rights" table="tb_role_right" cascade="all">
                    <key column="role_id"/>
                    <many-to-many column="right_id" class="hbp.sys.data.Right"/>
                  </set>

          4. 幾個(gè)值得注意的問題 :
                  a)
          xml? 映射文件中 , 寫類的名字時(shí)一定用類的全名 : : + 類名如 :(hbp.sys.data.Staff), 這個(gè)錯(cuò)誤使我費(fèi)了半天勁
          .:(
                  b)
          我在寫實(shí)現(xiàn)基本 DAO 操作時(shí) , 寫了

                       session.delete("from Right as right where right.id="+id); 
                      
          程序死活報(bào)錯(cuò) , 我折騰了半天 , 跟蹤到底 , 才恍然大悟 ,hibernate 在解析 sql 語句的時(shí)候把
                      
          其中的 right, 當(dāng)成了數(shù)據(jù)庫中的右連接 (" 保留字 "), , 這種關(guān)鍵字 , 不能隨便用啊 ,:)

          5. hibernate HQL 語言的查詢根據(jù)你的 sql 的不同而返回不同的對(duì)象類型 .
                  
          如果你使用
          session.find(String hql)
                  
          一般會(huì)返回一個(gè) List, :from Staff staff; 返回的是包含所有的員工對(duì)象的集合

                  
          如你的 hql :select count(*) from Staff staff; 則返回的是一個(gè) Integer 對(duì)象
                  
          如果你使用的 hql :select count(distinct staff.name),count(*) from Staff staff; 則返回的是一個(gè) Object
                  
          Object[], 需要先把他轉(zhuǎn)換成 Object[], 然后在取
          [0],[1].
                  
          這種設(shè)計(jì)我不知道 hibernate 是如何處理的 , 感覺既好也不好 . 好的是可以使用一個(gè) find 獲得任意查詢

                  
          不好在于根據(jù) hql 來處理返回結(jié)果 , 容易出錯(cuò) .

           

          posted on 2006-09-06 16:47 周銳 閱讀(180) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 如东县| 广宁县| 贵阳市| 金门县| 德江县| 黄龙县| 岑溪市| 延长县| 涞源县| 武平县| 万盛区| 潞城市| 扶沟县| 眉山市| 忻城县| 南投市| 太和县| 绵阳市| 元阳县| 泸西县| 昭平县| 兴业县| 永州市| 彭泽县| 额尔古纳市| 西林县| 运城市| 华阴市| 宜宾市| 峨边| 中江县| 明水县| 横山县| 宝清县| 乌鲁木齐市| 米泉市| 阳江市| 金昌市| 谢通门县| 陇南市| 绍兴市|