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.
          公告本博客在此聲明部分文章為轉摘,只做資料收集使用。


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

          留言簿(15)

          隨筆分類(1019)

          文章分類(3)

          文章檔案(21)

          收藏夾

          Link

          好友博客

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 865466
          • 排名 - 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><!--
          一次讀的數據庫記錄數 -->
                  <property name="jdbc.batch_size">30</property><!--
          設定對數據庫進行批量刪除
          -->
                  <property name="show_sql">true</property><!--
          Hibernate 發送給數據庫的 sql 顯示出來
          -->
                  <!-- Mapping files -->
                  <mapping resource="cat.hbm.xml"/>
              </session-factory>
          </hibernate-configuration>

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

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

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

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

          increment
          主鍵按數值順序遞增。此方式的實現機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候將此值加 1 作為主鍵。這種方式可能產生的問題是:不能在集群下使用。

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

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

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

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

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

          foreign
          使用另外一個相關聯的對象的標識符作為主鍵。

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

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

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

          重要的知識點 :
          1.
          如果有部門表 , 有員工表 , 員工表中有 dep_id, 則表部門類和員工類是 one-to-many 的關系
          :
            
          可以使用 :  ( 在部門類 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.
              
          那么表示部門和負責人之間的關系是 many-to-one 的關系

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

               <many-to-one name="staff" class="hbp.sys.data.Staff"  column="staff_id"/> 
           
           3.
          多對多關系 , 一般我們是做一個中間關聯表 . 我用角色和權限做了個例子 ,
                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();
               
          則兩者是明顯的多對多關系 . 使用 many-to-many 來實現
          ;
                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)
          我在寫實現基本 DAO 操作時 , 寫了

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

          5. hibernate HQL 語言的查詢根據你的 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[], 需要先把他轉換成 Object[], 然后在取
          [0],[1].
                  
          這種設計我不知道 hibernate 是如何處理的 , 感覺既好也不好 . 好的是可以使用一個 find 獲得任意查詢

                  
          不好在于根據 hql 來處理返回結果 , 容易出錯 .

           

          posted on 2006-09-06 16:47 周銳 閱讀(181) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 长沙市| 寿光市| 光山县| 新绛县| 光泽县| 射阳县| 周宁县| 西吉县| 房山区| 桂林市| 汉阴县| 清流县| 临泽县| 大宁县| 闽侯县| 荃湾区| 中宁县| 怀柔区| 昌平区| 旬阳县| 安岳县| 康定县| 建德市| 清河县| 鄂伦春自治旗| 宁化县| 香河县| 扶绥县| 鸡西市| 甘谷县| 安陆市| 河东区| 遂川县| 吉木萨尔县| 峨山| 兴国县| 老河口市| 东乌| 辽中县| 娄烦县| 铅山县|