posts - 0,  comments - 17,  trackbacks - 0
          來源:http://www.aygfsteel.com/martinx

          今天無意中在springframework中見到這個函數(shù)
          this.getHibernateTemplate().findByExampl(Object obj)

          以前沒注意到,看了一下源碼,原來就是Criteria中的Example.

          以前代碼如下

          package martin.xpost.model;

          import martin.xpost.hibernate.UserDAO;
          import martin.xpost.util.ListUtil;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * 
          @author martin
           
          */

          public class User {
              
          private String id;
              
          private String userName;
              
          private String password;
              
          private String realName;
              
          private String email;
              
          private List blogEntities = new ArrayList();
              
          private List rolls = new ArrayList();
              
              
          private UserDAO service;
              
              
          //getter and setter
              public void save() {
                  
          this.service.save(this);
              }


              
          public void remove() {
                  
          this.service.remove(this);
              }


              
          public boolean valid() {
                  
          return ListUtil.isNotEmpty(this.service.valid(this));
              }

          }

          DAO代碼如下
          package martin.xpost.hibernate.impl;

          import martin.xpost.hibernate.UserDAO;
          import martin.xpost.model.User;
          import martin.xpost.util.ListUtil;
          import org.hibernate.Query;
          import org.hibernate.Session;
          import org.springframework.orm.hibernate3.HibernateCallback;
          import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          import java.util.List;

          /**
           * 
          @author martin
           
          */

          public class HibernateUserDAO extends HibernateDaoSupport implements UserDAO {
              
          public void save(User user) {
                  
          this.getHibernateTemplate().merge(user);
              }


              
          public void remove(User user) {
                  
          this.getHibernateTemplate().delete(user);
              }


              
          public boolean valid(final User user) {
                  List list 
          = (List) this.getHibernateTemplate().execute(new HibernateCallback() {
                      
          public Object doInHibernate(Session session) throws org.hibernate.HibernateException {
                          Query query 
          = session.createQuery("from User user where user.userName=:userName and user.password=:password");
                          query.setString(
          "userName", user.getUserName());
                          query.setString(
          "password", user.getPassword());
                          
          return query.list();
                      }

                  }
          );
                  
          return ListUtil.isEmpty(list);
              }

          }

          重構(gòu)
          一:修改User的valid函數(shù)
              public boolean valid() {
                  
          return ListUtil.isNotEmpty(this.service.find(this));
              }

          DAO中只負(fù)責(zé)和數(shù)據(jù)源打交道,我們將邏輯全部轉(zhuǎn)到model里面(就是邏輯太簡單了o_o)。

          二:修改DAO代碼
          package martin.xpost.hibernate.impl;

          import martin.xpost.hibernate.UserDAO;
          import martin.xpost.model.User;
          import martin.xpost.util.ListUtil;
          import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          import java.util.List;

          /**
           * 
          @author martin
           
          */

          public class HibernateUserDAO extends HibernateDaoSupport implements UserDAO {
              
          public void save(User user) {
                  
          this.getHibernateTemplate().merge(user);
              }


              public void remove(User user) {
                  
          this.getHibernateTemplate().delete(user);
              }


              
          public List find(User user) {
                  
          return this.getHibernateTemplate().findByExample(user);
              }

          }

          這樣就簡單多了:)
          Test 一下:
          package martin.xpost;

          import martin.xpost.model.User;

          /**
           * 
          @author martin
           
          */

          public class UserTest extends TestBase {


              
          public void testAdd() {
                  User user 
          = (User) this.getBean("user");
                  user.setUserName(
          "martin");
                  user.setPassword(
          "1234");
                  user.setRealName(
          "martin xus");
                  user.setEmail(
          "martin.xus@gmail.com");
                  user.save();
                  assertNotNull(user.getId());
              }


              
          public void testValid() {
                  User user 
          = (User) this.getBean("user");
                  user.setUserName(
          "martin");
                  user.setPassword(
          "1234");
                  assertTrue(user.valid());
              }


              
          public void testRemove() {
                  User user 
          = (User) this.getBean("user");
                  user.setUserName(
          "martin");
                  user.setPassword(
          "1234");
                  user.remove();
                  assertNull(user.getId());
              }

          }

          第三個沒有通過:(看了一下log,原來this.getHibernateTemplate().delete(user)中user必須是持久層對象,也就是說user的id不能為空。

          再修改:首先判斷user.getId()是否為空,如果不為空,直接remvoe,否則,先find然后在remove.
              public void remove(User user) {
                  
          if (null != user.getId() && !"".equals(user.getId().trim())) {
                      
          this.getHibernateTemplate().delete(user);
                  }
           else {
                      List list 
          = find(user);
                      
          if (ListUtil.isNotEmpty(list))
                          
          for (Object o : list) {
                              
          this.getHibernateTemplate().delete(o);
                          }

                  }

              }

          OK,測試通過!

          posted on 2006-01-24

          posted on 2008-02-27 16:32 xyz 閱讀(765) 評論(0)  編輯  收藏 所屬分類: 網(wǎng)絡(luò)文摘

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿

          隨筆檔案(1)

          文章分類(44)

          文章檔案(46)

          收藏夾(1)

          Adobe

          AOP

          API

          appServer

          BI

          c

          • c-free
          • codeblocks
          • codelite
          • CodeLite IDE 是一個強(qiáng)大的開源,跨平臺的 C/C++整合開發(fā)環(huán)境. 支持包括 Windows、Linux 和 Mac 系統(tǒng)下運(yùn)行
          • codelite官網(wǎng)
          • dev-c++
          • Dev-C++是一個C&C++開發(fā)工具,它是一款自由軟件,遵守GPL協(xié)議。
          • GCC
          • GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本只能處理 C語言。GCC 很快地擴(kuò)展,變得可處理 C++。之后也變得可處理 Fortran、Pascal、Objective-C、Java, 以及 Ada 與其他語言。

          Cache

          CMS

          DB

          eclipse

          FreeMarker

          hibernate

          html5

          ibatis

          java

          jquery

          js

          json

          Linux

          Log

          mail server

          mobile

          mysql

          oauth

          openID

          other

          PHP

          portal

          report

          Scheduler

          schema

          Security

          SOA

          spring

          struts

          UI原型設(shè)計

          w3c

          Wap

          webservice

          xml

          供應(yīng)鏈管理

          博客鏈接

          好網(wǎng)站

          工作流

          開源網(wǎng)

          招聘

          插件下載

          操作系統(tǒng)

          構(gòu)建可伸縮的系統(tǒng)

          構(gòu)建工具

          測試

          游戲

          源碼托管

          經(jīng)營

          資源

          金融/財務(wù)

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 镇安县| 玉环县| 读书| 邯郸市| 郓城县| 莱州市| 温泉县| 洛川县| 静乐县| 大足县| 壶关县| 绍兴县| 洛扎县| 合川市| 东乡族自治县| 二连浩特市| 方正县| 奉贤区| 秦皇岛市| 大连市| 巴彦淖尔市| 朝阳市| 包头市| 高尔夫| 道孚县| 讷河市| 城口县| 平陆县| 镇安县| 铜山县| 申扎县| 濮阳市| 天镇县| 乐平市| 富宁县| 伊宁县| 翁牛特旗| 万源市| 灵丘县| 达拉特旗| 海阳市|