簡介HibernateTemplate

          就類似JdbcTemplate一樣,HibernateTemplate封裝了Hibernate存儲時的一些細(xì)節(jié),例如try...catch的例外處理等等,HibernateTemplate的使用在觀念上與JdbcTemplate是類似的,這邊簡單的介紹一下HibernateTemplate的使用。

            首先我們看一下Bean定義檔,這與前一個主題沒什麼太大的差別:

           代碼:

          <?xml version="1.0" encoding="UTF-8"?> 
          <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd"> 
          <beans> 
              <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
                  <property name="driverClassName"> 
                      <value>com.mysql.jdbc.Driver</value> 
                  </property> 
                  <property name="url"> 
                      <value>jdbc:mysql://localhost:3306/TestDB</value> 
                  </property> 
                  <property name="username"> 
                      <value>caterpillar</value> 
                  </property> 
                  <property name="password"> 
                      <value>123456</value> 
                  </property> 
              </bean> 
              
              <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean" destroy-method="close"> 
                  <property name="dataSource"> 
                      <ref bean="dataSource"/> 
                  </property> 
                  <property name="mappingResources"> 
                      <list> 
                          <value>User.hbm.xml</value> 
                      </list> 
                  </property> 
                  <property name="hibernateProperties"> 
                      <props> 
                          <prop key="hibernate.dialect"> 
                              net.sf.hibernate.dialect.MySQLDialect 
                          </prop> 
                          <prop key="hibernate.show_sql"> 
                              true 
                          </prop> 
                      </props> 
                  </property> 
              </bean> 
          
          
              <bean id="userDAO" class="onlyfun.caterpillar.UserDAO"> 
                  <property name="sessionFactory"> 
                      <ref bean="sessionFactory"/> 
                  </property> 
              </bean> 
          </beans>

            在這邊UserDAO將繼承自HibernateDaoSupport類別,這可以幫我們省去一些管理sessionFactory、hibernateTemplate資源的工作,我們只要注入sessionFactory就好了,我們的DAO設(shè)計如下:

           代碼:

          UserDAO.java
          package onlyfun.caterpillar; 
          
          import net.sf.hibernate.*; 
          import org.springframework.orm.hibernate.*; 
          import org.springframework.orm.hibernate.support.*; 
          
          
          public class UserDAO extends HibernateDaoSupport { 
              public void insertUser(final User user) { 
                  getHibernateTemplate().execute(new HibernateCallback() { 
                          publicObject doInHibernate(Session session) throws HibernateException { 
                              session.saveOrUpdate(user); 
                              returnnull; 
                          } 
                      }); 
              } 
          }

            只要注入sessionFactory,之後調(diào)用getHibernateTemplate()就可以取得HibernateTemplate的實例,我們利用callback方法,實作HibernateCallback介面,在doInHibernate()中進(jìn)行存儲操作。

            對於簡單的存儲操作,我們甚至可以直接使用HibernateTemplate所提供的find()、load()、saveOrUpdate()、delete()等方法,而不用使用callback,例如:

           代碼:

          UserDAO.java
          package onlyfun.caterpillar; 
          
          import org.springframework.orm.hibernate.support.*; 
          
          public class UserDAO extends HibernateDaoSupport { 
              public void insertUser(User user) { 
                  getHibernateTemplate().saveOrUpdate(user); 
              } 
          }

            不用懷疑,程式就是如此簡單,所有的細(xì)節(jié)都被封裝起來了。

            HibernateTemplate中只能丟出unckecked例外,如果需要處理checked例外,則您可以使用AOP Interceptor來取代HibernateTemplate,從而取代callback方法,在參考手冊中有介紹如何配置,這邊複製過來以便參考:

           代碼:

          .... 
              <bean id="myHibernateInterceptor" 
                  class="org.springframework.orm.hibernate.HibernateInterceptor"> 
                  <property name="sessionFactory"> 
                      <ref bean="mySessionFactory"/> 
                  </property> 
              </bean> 
          
              <bean id="myProductDaoTarget" class="product.ProductDaoImpl"> 
                  <property name="sessionFactory"> 
                      <ref bean="mySessionFactory"/> 
                  </property> 
              </bean> 
          
              <bean id="myProductDao" class="org.springframework.aop.framework.ProxyFactoryBean"> 
                  <property name="proxyInterfaces"> 
                      <value>product.ProductDao</value> 
                  </property> 
                  <property name="interceptorNames"> 
                      <list> 
                          <value>myHibernateInterceptor</value> 
                          <value>myProductDaoTarget</value> 
                      </list> 
                  </property> 
              </bean> 
          ....

           代碼:

          ProductDaoImpl.java
          public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao { 
          
              public List loadProductsByCategory(finalString category) throws MyException { 
                  Session session = SessionFactoryUtils.getSession(getSessionFactory(), false); 
                  try { 
                      List result = session.find( 
                          "from test.Product product where product.category=?", 
                          category, Hibernate.STRING); 
                      if (result == null) { 
                          thrownew MyException("invalid search result"); 
                      } 
                      return result; 
                  } 
                  catch (HibernateException ex) { 
                      throw SessionFactoryUtils.convertHibernateAccessException(ex); 
                  } 
              } 
          }

          posted on 2007-03-09 08:57 77 閱讀(1244) 評論(0)  編輯  收藏 所屬分類: ajax技術(shù)


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2007年3月>
          25262728123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(12)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          API文檔

          java開發(fā)與研究

          にほん

          上海房產(chǎn)

          東京生活

          數(shù)據(jù)庫大全

          編程與開發(fā)

          美國開發(fā)生活

          走向管理

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 海宁市| 嵊泗县| 茌平县| 水富县| 柘城县| 古蔺县| 泽库县| 阿荣旗| 阿鲁科尔沁旗| 内乡县| 长宁区| 肇源县| 栾川县| 土默特右旗| 常山县| 唐海县| 江津市| 吉水县| 长治县| 兰坪| 明水县| 舟曲县| 赣榆县| 武鸣县| 太白县| 虎林市| 铅山县| 罗平县| 乌鲁木齐县| 海丰县| 蓬溪县| 苍梧县| 双柏县| 大名县| 景谷| 扶风县| 巴塘县| 新兴县| 常山县| 阿拉善左旗| 商都县|