love fish大鵬一曰同風(fēng)起,扶搖直上九萬(wàn)里

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          friends

          link

          最新評(píng)論

          Hibernate O/R映射三大基本定則(轉(zhuǎn))

          1. 引言
          在Java環(huán)境下,有多種對(duì)象關(guān)系映射方法,如實(shí)體Bean、OJB、JDO、JDBC等。Hibernate是一種新的O/R映射工具,它不僅提供了從Java類到數(shù)據(jù)表的映射,也提供了數(shù)據(jù)查詢和恢復(fù)等機(jī)制。Hibernate非常簡(jiǎn)單易學(xué),目前國(guó)內(nèi)有很多同行已經(jīng)或正在用Hibernate開發(fā)實(shí)施項(xiàng)目;但Hibernate有很多規(guī)則不為人知或應(yīng)用甚少。本文的目的就是將這些規(guī)則歸納總結(jié),希望對(duì)您的開發(fā)和設(shè)計(jì)有益。

          首先聲明,本文是Hibernate入門級(jí)文章,高手請(qǐng)不用往下看了。

          2. 基本定則

          定則一:數(shù)據(jù)庫(kù)配置文件名稱可以不是Hibernate.properties或Hibernate.cfg.xml

          由于Hibernate官方文檔(本文指www.hibernate.org的文檔)的影響,很多Hibernate開發(fā)者誤以為系統(tǒng)一定要有名稱為Hibernate.properties或Hibernate.cfg.xml的文件,而且一定要放在classes的根目錄下。實(shí)際上,該文件只是一般的配置文件,名稱可以自己取,文件位置可以自己定,而且在多數(shù)據(jù)庫(kù)環(huán)境下,可以有多個(gè)配置文件,使得程序可以連接多個(gè)數(shù)據(jù)庫(kù)。只是您在創(chuàng)建會(huì)話工廠時(shí)需要特殊處理,代碼示例如下:

          //配置文件名稱

          protected static String CONFIG_FILE = "my_hibernate.config";

          //配置文件目錄,可以考慮在該目錄下存放系統(tǒng)所有配置文件,此處使用虛擬機(jī)參數(shù)

          String configPath = System.getProperty("my.config");

          //創(chuàng)建會(huì)話工廠

          sessionFactory =( new Configuration().configure(new File(configPath+File.separator+CONFIG_FILE))) .buildSessionFactory();



          定則二:小型項(xiàng)目中,.hbm.xml文件可以合并到一個(gè)文件中

          同樣由于Hibernate官方文檔的影響,很多Hibernate開發(fā)者誤以為Hibernate的對(duì)象關(guān)系映射一定要一個(gè)表對(duì)應(yīng)一個(gè)對(duì)象,并將映射文件和對(duì)象文件放在同一目錄下。實(shí)際上,該模式是為規(guī)范性考慮而設(shè)計(jì)的,因?yàn)樵诙嗳藚⑴c的項(xiàng)目中,多人要維護(hù)同一文件容易產(chǎn)生沖突;當(dāng)項(xiàng)目比較小時(shí),配置文件的維護(hù)人員少,我們完全可以將.hbm.xml文件合并到一個(gè)或者幾個(gè)文件中。依據(jù)作者本人的項(xiàng)目設(shè)計(jì)開發(fā)經(jīng)驗(yàn),最好是項(xiàng)目中有幾人同時(shí)從事O/R映射和持久工作,則設(shè)定幾個(gè).hbm.xml文件,每人維護(hù)一個(gè)。當(dāng)然,為了便于分類和管理,每人的工作應(yīng)該按邏輯劃分。

          大型項(xiàng)目中的文件配置示例如下:

          <hibernate-configuration>

          <session-factory>

          <!—映射文件分散 -->

          <mapping resource="com/hongsoft/test/ persistence/Cat.hbm.xml"/>

          <mapping resource="com/hongsoft/test/ persistence/Animal.hbm.xml"/>

          </session-factory>

          </hibernate-configuration>

          小型項(xiàng)目中的文件配置示例如下:

          <hibernate-configuration>

          <session-factory>

          <!—映射文件集中 -->

          <mapping resource="res_hibernate_map.xml"/>

          </session-factory>

          </hibernate-configuration>

          要注意的是, 從對(duì)Hibernate源代碼的分析可知,指定映射文件時(shí),不能用絕對(duì)目錄,只能用相對(duì)目錄;而且,系統(tǒng)以classes根目錄為當(dāng)前目錄。



          定則三:對(duì)象關(guān)系映射是以.hbm.xml文件為基準(zhǔn)的,而不是以PO文件為基準(zhǔn)

          該定律的意思是:系統(tǒng)啟動(dòng)檢查您的對(duì)象關(guān)系映射是否正確時(shí),是以.hbm.xml為基準(zhǔn)來(lái)進(jìn)行檢查的;對(duì)象文件的property可以比映射文件的property多,但不能少。如果您有如下的映射:

          <class name="com.hongsoft.test.User" table="res_user">

          <id name="id" column="id" type="long" unsaved-value="any">

          <generator class="assigned">

          </generator>

          </id>

          <property name="name"/>

          <property name="loginName"/>

          <property name="passwd"/>

          </class>

          系統(tǒng)啟動(dòng),檢查數(shù)據(jù)庫(kù)和其他配置正確后,將以該文件為基準(zhǔn),首先檢查User對(duì)象中有無(wú)id屬性和對(duì)應(yīng)的get/set方法,如果沒有則報(bào)錯(cuò),如果有且正確則檢查有無(wú)name屬性和對(duì)應(yīng)的get/set方法……,直到文件結(jié)束。要注意的是,如果屬性為name,則get方法名稱必須為getName(),set方法名稱必須為setName(),否則會(huì)報(bào)錯(cuò)。

          如果User對(duì)象除了有id,name,loginName, passwd四個(gè)屬性和對(duì)應(yīng)的方法,還有其它的屬性和方法,會(huì)報(bào)錯(cuò)嗎?不會(huì),因?yàn)閷?duì)象關(guān)系映射是以.hbm.xml文件為基準(zhǔn)的,而不是以PO文件為基準(zhǔn)。您在項(xiàng)目中可以充分利用該特點(diǎn),實(shí)現(xiàn)您自己的比較特殊的需求。例如,您可以在User對(duì)象中加入updatedPasswd表示更改后的口令,由此構(gòu)造在表示層要使用的FormBean和在業(yè)務(wù)層要使用的ValueObject。當(dāng)然,這樣做也有缺點(diǎn),需要根據(jù)您的實(shí)際情況而定。

          3. 總結(jié)
          上面是作者對(duì)Hibernate映射的容易理解錯(cuò)誤的知識(shí)點(diǎn)的歸納總結(jié),希望對(duì)您有幫助。如果您發(fā)現(xiàn)有錯(cuò)誤或有自己的觀點(diǎn),歡迎討論。

          posted on 2007-03-29 15:06 liaojiyong 閱讀(398) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 米泉市| 阿鲁科尔沁旗| 佛冈县| 平邑县| 万年县| 宣城市| 民和| 龙游县| 阿克苏市| 西平县| 思茅市| 阿图什市| 星子县| 灵宝市| 黄平县| 朔州市| 辽阳县| 义乌市| 龙泉市| 岫岩| 大化| 精河县| 饶平县| 确山县| 濉溪县| 招远市| 衢州市| 广西| 三亚市| 闽清县| 清徐县| 邵阳市| 河池市| 阳高县| 博白县| 哈密市| 通化县| 庐江县| 祁东县| 灵山县| 邵阳县|