posts - 431,  comments - 344,  trackbacks - 0
          公告
           Don't Repeat Yourself
          座右銘:you can lose your money, you can spent all of it, and if you work hard you get it all back. But if you waste your time, you're never gonna get it back.
          公告本博客在此聲明部分文章為轉(zhuǎn)摘,只做資料收集使用。


          微信: szhourui
          QQ:109450684
          Email
          lsi.zhourui@gmail.com
          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          留言簿(15)

          隨筆分類(1019)

          文章分類(3)

          文章檔案(21)

          收藏夾

          Link

          好友博客

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 863950
          • 排名 - 44

          最新評論

          閱讀排行榜

          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è)定對數(shù)據(jù)庫進行批量刪除
          -->
                  <property name="show_sql">true</property><!--
          Hibernate 發(fā)送給數(shù)據(jù)庫的 sql 顯示出來
          -->
                  <!-- Mapping files -->
                  <mapping resource="cat.hbm.xml"/>
              </session-factory>
          </hibernate-configuration>

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

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

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

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

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

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

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

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

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

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

          foreign
          使用另外一個相關(guān)聯(lián)的對象的標識符作為主鍵。

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

          2 、對于 sql server2000 中的數(shù)據(jù)庫子增字段 , 在配置文件使用下列方法實現(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)鍵字來實現(xiàn)

          3 、如果表中的主鍵用字符串類型 : 可以用 hibernate 自己提供的方法實現(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 位的算法來生成一個 32 位字符串。最通用的一種方式。適用于所有數(shù)據(jù)庫。

          重要的知識點 :
          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.
          如果部門要有一個負責人 , 即部門表 (tb_department) 中有一個字段 :staff_id.
              
          那么表示部門和負責人之間的關(guān)系是 many-to-one 的關(guān)系

               Department
          :
                /**
          部門負責人
          id */
              private Staff staff;
             
              xml
          文件

               <many-to-one name="staff" class="hbp.sys.data.Staff"  column="staff_id"/> 
           
           3.
          多對多關(guān)系 , 一般我們是做一個中間關(guān)聯(lián)表 . 我用角色和權(quán)限做了個例子 ,
                Right(id,name)     Role(id,name)  
          中間表
          :tb_role_right(role_id,right_id)
                Right
          類中有一個 Role 的集合
          :private Set roles=new TreeSet();
                Role
          類中也有一個 Right 的集合
          :private Set rights=new TreeSet();
               
          則兩者是明顯的多對多關(guān)系 . 使用 many-to-many 來實現(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. 幾個值得注意的問題 :
                  a)
          xml? 映射文件中 , 寫類的名字時一定用類的全名 : : + 類名如 :(hbp.sys.data.Staff), 這個錯誤使我費了半天勁
          .:(
                  b)
          我在寫實現(xiàn)基本 DAO 操作時 , 寫了

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

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

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

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

           

          posted on 2006-09-06 16:47 周銳 閱讀(179) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 翼城县| 政和县| 原平市| 黑水县| 类乌齐县| 通城县| 大足县| 侯马市| 奉节县| 西宁市| 肃北| 远安县| 察雅县| 甘泉县| 谢通门县| 高台县| 彩票| 丹寨县| 宜丰县| 如皋市| 中宁县| 丰都县| 鱼台县| 潍坊市| 旅游| 赤壁市| 泰兴市| 卓尼县| 阿坝县| 滁州市| 纳雍县| 正蓝旗| 十堰市| 扎兰屯市| 资兴市| 山丹县| 和平区| 土默特右旗| 门头沟区| 阿拉善左旗| 桐梓县|