簡介HibernateTemplate

          就類似JdbcTemplate一樣,HibernateTemplate封裝了Hibernate存儲時的一些細節,例如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設計如下:

           代碼:

          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,之後調用getHibernateTemplate()就可以取得HibernateTemplate的實例,我們利用callback方法,實作HibernateCallback介面,在doInHibernate()中進行存儲操作。

            對於簡單的存儲操作,我們甚至可以直接使用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); 
              } 
          }

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

            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技術


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


          網站導航:
           
          <2007年3月>
          25262728123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          API文檔

          java開發與研究

          にほん

          上海房產

          東京生活

          數據庫大全

          編程與開發

          美國開發生活

          走向管理

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 花垣县| 丹棱县| 高邮市| 临汾市| 永定县| 怀远县| 黄浦区| 霍山县| 方正县| 双城市| 尉犁县| 博罗县| 家居| 平南县| 四子王旗| 永登县| 长宁区| 汶川县| 宽城| 麻城市| 壤塘县| 巴马| 景谷| 清水河县| 修武县| 枝江市| 麦盖提县| 吴江市| 会昌县| 项城市| 长泰县| 惠安县| 方正县| 凉城县| 扎兰屯市| 宝坻区| 德江县| 青田县| 宜川县| 桓台县| 社会|