posts - 66,  comments - 11,  trackbacks - 0
          class屬性有一下幾種類型:
          1、Assiged:主鍵由應(yīng)用邏輯產(chǎn)生,數(shù)據(jù)交由Hibernate保存時,主鍵值已經(jīng)設(shè)置完畢,無需Hibernate干預。
          2、hilo:通過hi/lo算法實現(xiàn)的主鍵生成機制,需要額外的數(shù)據(jù)庫表保存主鍵生成歷史狀態(tài)。
          3、與hilo類似,通過hi/lo算法實現(xiàn)的主鍵生成機制,只是主鍵歷史狀態(tài)保存在Sequence中,適用于支持Sequence的數(shù)據(jù)庫。
          4、incremaent:主鍵按數(shù)值順序遞增。此方式的實現(xiàn)機制為在當前應(yīng)用中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候?qū)⒋酥导?作為主鍵。如果同一數(shù)據(jù)庫有多個實例訪問,此方式必須避免使用。
          5、identity:采用數(shù)據(jù)庫提供的主鍵生成機制.
          6、sequence:采用數(shù)據(jù)庫提供的sequence機制生成主鍵
          7、native:由Hibernate根據(jù)數(shù)據(jù)庫適配器中的定義,自動采用identity、hilo、sequence的其中一種作為主鍵生成方式。
          8、uuid.hex:這種主鍵生成機制在最大程度上保證了產(chǎn)生ID的唯一性。
          9、uuid.string:與uuid.hex類似。
          10、foreign:使用外部表的字段作為主鍵。

              由于常用的數(shù)據(jù)庫,如SQLServer、MySql等,都提供了易用的主鍵生成機制。我們可以在數(shù)據(jù)庫提供的主鍵生成機制上,采用generator-class=native的主鍵生成方式。
              不過,值得注意的是,一些數(shù)據(jù)庫提供的主鍵生成機制在效率上未必最佳,大量并發(fā)insert數(shù)據(jù)時可能會引起表之間的互鎖。
              數(shù)據(jù)庫提供的主鍵生成機制,往往是通過在一個內(nèi)部表中保存當前主鍵狀態(tài),之后每次插入數(shù)據(jù)會讀取這個最大值,然后加上遞增量作為新記錄的主鍵值,之后再把這個新的最大值更新回內(nèi)部表中,這樣,一次Insert操作可能導致數(shù)據(jù)庫內(nèi)部多次表讀寫操作,同時伴隨的還有數(shù)據(jù)的加鎖解鎖操作,這對性能產(chǎn)生了很大影響。
              另外,對于借用Sequence作為主鍵產(chǎn)生機制的數(shù)據(jù)庫而言,如Oracle,如果采用<generator class="sequence">設(shè)定,那么插入一條新的數(shù)據(jù)之前,Hibernate必須首先向數(shù)據(jù)庫發(fā)起一條select sequence操作以獲取主鍵值。
              這樣,一次保存操作實際上包含了2個過程,首先查詢sequence獲得主鍵,其次執(zhí)行Insert插入記錄,無疑操作效率相對較低。
              大多數(shù)情況下,如果邏輯允許,可以考慮使用uuid.hex主鍵生成方式。

              Hibernate3同時還提供了另一種與實體類型無關(guān)的映射方式:動態(tài)模型(Dynamic Model),所謂動態(tài)模型,即通過通用數(shù)據(jù)容器(Map)對庫表記錄進行表達。
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <hibernate-mapping>
              
          <class entity-name="DynamicUserMap" table="T_User">
                  
          <id name="id" column="id" type="java.lang.Integer">
                      
          <generator class="native"/>
                  
          </id>
                  
          <property name="name" type="java.lang.String" column="name"/>
                  
          <property name="age" type="java.lang.Integer" column="age"/>
              
          </class>
          </hibernate-mapping>

          操作示例:
          session = sessionFactory.openSession().getSession(EntityMode.MAP);
          Map userMap 
          = new HashMap();
          userMap.put(
          "name","ken");
          userMap.put(
          "age",new Integer(25));

          Transaction tx 
          = session.beginTransaction();
          session.save(
          "DynamicUserMap",userMap);
          tx.commit();

          首先,我們以EntityMode.MAP模式獲取Session實例,以此表明Session操作的對象并非普通的實體類,而是Map類型數(shù)據(jù)。
          其次,在執(zhí)行實體操作時,須指明要操作的實體名:
          session.save("DynamicUserMap",userMap);

          posted on 2009-10-16 14:22 王永慶 閱讀(221) 評論(0)  編輯  收藏 所屬分類: HIBERNATE
          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關(guān)注blogs

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宁安市| 老河口市| 张家口市| 佛山市| 漳浦县| 威信县| 娱乐| 冀州市| 舒城县| 湖州市| 鲜城| 滨海县| 饶阳县| SHOW| 哈巴河县| 额尔古纳市| 满城县| 札达县| 桃源县| 周口市| 维西| 遂溪县| 东丰县| 亚东县| 灌云县| 剑川县| 张掖市| 荆门市| 富民县| 衢州市| 夏津县| 景东| 大安市| 浦城县| 登封市| 甘谷县| 新和县| 和政县| 汕尾市| 怀化市| 绥芬河市|