MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Hibernate 的確通過 PersistentEnum 接口提供了對(duì)標(biāo)準(zhǔn)化 的支持,這使得我們的域?qū)ο髮?shí)現(xiàn)了一個(gè)與 ShippingCompany 對(duì)象非常類似的結(jié)構(gòu)。然而,我們可能對(duì)將域?qū)ο笈c某個(gè)特定的持久化實(shí)現(xiàn)過于耦合持保守態(tài)度。如果我們計(jì)劃長期使用 Hibernate ,這可能并不是一個(gè)太大的問題,但是請(qǐng)謹(jǐn)慎考慮這個(gè)決策。如果我們使用 ibatis ,那么我們就完全沒那么幸運(yùn)了;它完全不支持標(biāo)準(zhǔn)化。謝天謝地,如果我們的 ORM 導(dǎo)致過耦合或者完全沒有這方面的支持,還有個(gè)解決方案——使用 JDBC

          Spring 的支持,使用 JDBC 變得如此簡單,我們不會(huì)再因?yàn)樗膹?fù)雜性而將其的優(yōu)先級(jí)打個(gè)折扣。可是,如果我們選擇使用某個(gè)特定的 ORM 工具,那么我們就很難用基于 JDBC DAO 實(shí)現(xiàn)進(jìn)行替換了——目前我們就是這樣。當(dāng)我們同時(shí)在一個(gè)類中包含了 JDBC hibernate 代碼時(shí),我們就無法使用 Spring 提供的支持。因?yàn)槲覀兊?/span> DAO 只能擴(kuò)展 HibernateDaoSupport JdbcDaoSupport 二者之一。幸運(yùn)的是,這里有一個(gè)優(yōu)雅的解決方案,它允許我們將 Hibernate JDBC 代碼封裝在同一個(gè)類之內(nèi),而不會(huì)因此失去 Spring 的支持。這個(gè)方案的關(guān)鍵在于將 JDBC 代碼封裝在內(nèi)部類中,之后將主體 DAO 的調(diào)用委托給這個(gè)內(nèi)部類去完成。代碼清單 11-6 提供了一個(gè)示例:

          代碼清單 11-16. 在一個(gè)單獨(dú)的 DAO 中混合使用 Hibernate JDBC

          package com.apress.prospring.ch11.canonicalization;

          ?

          import org.springframework.jdbc.core.support.JdbcDaoSupport;

          import org.springframework.orm.hibernate.support.HibernateDaoSupport;

          ?

          public class MyDao extends HibernateDaoSupport {

          ?

          ?? private MyJdbcDao innerDao;

          ?

          ?? public MyDao() {

          ????? innerDao = new MyJdbcDao();

          ?? }

          ?

          ?? public void update(MyDomainObject obj) {

          ????? // use Hibernate to persist the data

          ?? }

          ?

          ?? public MyDomainObject getById(int someId) {

          ????? return innerDao.getBy(someId);

          ?? }

          ?

          ?? private static class MyJdbcDao extends JdbcDaoSupport {

          ?

          ????? public MyDomainObject getBy(int someId) {

          ???????? // do some real processing

          ???????? return null;

          ????? }

          ?? }

          }

          ?

          盡管這只是一個(gè)簡單的實(shí)現(xiàn),我們也可以從中得到啟發(fā)。所有的 JDBC 相關(guān)代碼都被轉(zhuǎn)移到一個(gè)內(nèi)部類中,而此內(nèi)部類擴(kuò)展了 JdbcDaoSupport , 所有的 Hibernate 相關(guān)功能都留在外部,外部類仍然是 HibernateDaoSupport . 的子類。通過這個(gè)類,我們可以使用 Hibernate 完成域?qū)ο蟮某志没俏覀兛梢詫⒉樵児δ芙唤o嵌入的 JDBC DAO 去完成。

          在我們的應(yīng)用中有效利用標(biāo)準(zhǔn)化 ,可以通過避免大量無謂對(duì)象的創(chuàng)建,從而極大提升內(nèi)存使用效率。如果我們必須更新標(biāo)準(zhǔn)化對(duì)象相關(guān)的數(shù)據(jù),同時(shí)我們?cè)?/span> DAO 中使用了 ORM 框架,那么我們就可以以 ORM 無關(guān)的形式引入一些 JDBC 代碼來加入標(biāo)準(zhǔn)化 支持。


          來源:Pro Spring中文版 http://book.csdn.net/bookfiles/48/100481407.shtml

          http://hi.baidu.com/%D3%F4%C3%C6%BB%A8%C9%FA%BD%B4/blog/item/7768d41e8c06ceffe0fe0ba6.html

          主站蜘蛛池模板: 巴林右旗| 柏乡县| 喜德县| 新安县| 鲜城| 茶陵县| 抚远县| 得荣县| 文安县| 黎平县| 芷江| 专栏| 灵武市| 象州县| 沙洋县| 湘潭县| 余干县| 十堰市| 灵山县| 尤溪县| 嘉定区| 房山区| 安平县| 绵竹市| 新郑市| 徐州市| 陇川县| 郯城县| 循化| 吉林市| 綦江县| 德安县| 襄汾县| 桐柏县| 石河子市| 新昌县| 平果县| 河源市| 阿坝县| 孟村| 陈巴尔虎旗|