posts - 89,  comments - 98,  trackbacks - 0
          Pro Hibernate 3筆記和小結(jié)(2)之第一章Hibernate3介紹

          /**
          作者:Willpower
          來源:Rifoo Technology(
          http://www.rifoo.com
          時間:2006-05
          備注:轉(zhuǎn)載請保留以上聲明
          **/


          今天繼續(xù)第一章的學(xué)習(xí),我們先來看看EJB和Hibernate的區(qū)別。

          為什么不用EJB來存儲,顯示,查詢數(shù)據(jù)庫中的數(shù)據(jù)呢?嚴(yán)格的說,EJB服務(wù)器支持兩種類型的持久化,就是BEAN管理的持久化(BMP)和容器管理的持久化(CMP)。在BMP中,Bean自己負(fù)責(zé)執(zhí)行所有的SQL語句來完成存儲和查詢數(shù)據(jù)。換句話說,我們自己要去編寫JDBC邏輯代碼。另一方面,CMP是由容器來執(zhí)行存儲和檢索bean數(shù)據(jù)的工作。

          我們這里不選擇EJB的原因如下:
          1 CMP實體bean需要和數(shù)據(jù)表一對一的映射
          2 它們很慢
          3 有時候要人工參與的去決定哪一個bean字段對應(yīng)表的哪一列
          4 它們對方法命名有要求
          5 EJB的容器是重量級的
          6 它們和容器依賴強,不容易移植

          下面看看Hibernate的特點:
          1 不需要強制映射一個POJO到一個表,不強制一對一的關(guān)系
          2 盡快啟動并加載它的配置文件時會對性能有些負(fù)載,但總的來說,它是很快的工具
          3 和容器沒有強依賴,很方便的移植
          4 可以很輕松的處理serializable POJOs

          以上只是簡單的列舉,還有很多特點都沒有提及。總之,Hibernate在應(yīng)用程序的持久層這一塊是非常不錯的框架。下面我們來看一個Hibernate的Hello world程序:

          Listing 1-4. Hibernate檢索POJO的范例代碼
          CODE:

          public static Motd getMotd(int messageId)
          ? ? ? ? ? ? ? ? ? throws MotdException
          {
          ? SessionFactory sessions =
          ? ? ? ? ? ? new Configuration().configure().buildSessionFactory();
          ? Session session = sessions.openSession();
          ? Transaction tx = null;
          ? try {
          ? ? tx = session.beginTransaction();
          ? ? Motd motd =
          ? ? ? ? ? ? (Motd)session.get( Motd.class,
          ? ? ? ? ? ? new Integer(messageId));
          ? ? tx.commit();
          ? ? tx = null;
          ? ? return motd;
          ? } catch ( HibernateException e ) {
          ? ? if ( tx != null ) tx.rollback();
          ? ? ? ? log.log(Level.SEVERE, "Could not acquire message", e);
          ? ? ? ? throw new MotdException(
          ? ? ? ? ? ? "Failed to retrieve message from the database.",e);
          ? } finally {
          ? ? session.close();
          ? }
          }


          大家可以看到,代碼量減少了很多,SessionFactory通常用于原來類似EJB的JNDI尋址操作。
          由于messageId是Motd對象的主鍵,我們只用了一行代碼就完成了數(shù)據(jù)的檢索工作:

          Motd motd = (Motd)session.get(Motd.class, new Integer(messageId));

          如果不是直接關(guān)鍵主鍵的那些更復(fù)雜一些的查詢,則需要使用SQL或HQL(Hibernate Query Language)。實際上,Hibernate3給我們提供了自動的事務(wù)和緩存的功能,因此,我們不用在出錯處理上象JDBC那樣編寫過多的冗余代碼了。

          Hibernate還需要知道哪個表來關(guān)聯(lián)哪個對象,這個實際上由一個XML映射文件來提供的。盡管有些工具會造成大量的冗余難讀懂的XML文件,但是Hibernate在這一塊上處理非常輕巧,針對每個需要映射到數(shù)據(jù)庫中的那些POJO對象,我們只需要創(chuàng)建一個簡單而清晰的XML文件就可以了。當(dāng)然,也可以將所有信息都放到一個大的XML文件中,Hibernate照樣能讀懂它們,可是這種做法不被推薦使用,因為可讀和可維護(hù)性都太差了。

          一個文檔類型定義(Document Type Definition,簡稱DTD)文件提供給所有的Hibernate配置文件,因此如果有好的XML編輯器,那么可以使用自動完成和自動驗證XML的很多方便的功能來編輯XML配置文件,有些工具甚至可以自動創(chuàng)建這些配置文件。而Java 5中新加入的注釋語法(annotations)能夠完全取代它們。

          下面是我們的Motd POJO對象到數(shù)據(jù)庫的映射文件:

          Listing 1-5. 映射POJO到數(shù)據(jù)庫的XML文件
          CODE:

          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]">

          <hibernate-mapping>
          ? <class name="Motd" table="Motd">
          ? ? <id name="id" type="int" column="id">
          ? ? ? ? <generator class="native"/>
          ? ? </id>
          ? ? <property name="message" column="message" type="string"/>
          ? </class>
          </hibernate-mapping>


          你可能會問,是不是將復(fù)雜性簡單地從應(yīng)用的代碼轉(zhuǎn)移到了XML映射文件中了呢?事實上并不是這樣。
          1 XML文件比從結(jié)果集返回的復(fù)雜的POJO對象更容易編輯和處理
          2 使我們可以排除類似JDBC那樣的錯誤處理機制的代碼復(fù)雜性
          3 最重要的是,如果POJO提供類似javabean那樣的屬性訪問方法(即getter和setter方法),和一個默認(rèn)的構(gòu)造方法,那么Hibernate的工具可以方便的自動生成XML文件。關(guān)于工具的使用在第10章中討論
          posted on 2006-07-28 10:06 水煮三國 閱讀(504) 評論(0)  編輯  收藏 所屬分類: Hibernate
          <2006年7月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(4)

          隨筆分類(85)

          隨筆檔案(89)

          文章分類(14)

          文章檔案(42)

          收藏夾(37)

          java

          oracle

          Sybase

          搜索

          •  

          積分與排名

          • 積分 - 211659
          • 排名 - 266

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 大城县| 壤塘县| 和硕县| 开平市| 拜城县| 徐闻县| 井研县| 佛坪县| 永和县| 巍山| 娱乐| 晋宁县| 仲巴县| 秦安县| 宁陕县| 绥阳县| 淳化县| 巴东县| 集安市| 特克斯县| 白玉县| 上杭县| 神木县| 辉南县| 施秉县| 包头市| 蒲江县| 南华县| 北京市| 浮梁县| 米林县| 泰来县| 新化县| 陇南市| 集贤县| 乌拉特中旗| 西盟| 读书| 尼玛县| 宾阳县| 弥勒县|