posts - 0,  comments - 17,  trackbacks - 0
来源:http://www.blogjava.net/martinx

今天无意中在springframework中见到这个函数
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);
    }

}

重构
一:修改User的valid函数
    public boolean valid() {
        
return ListUtil.isNotEmpty(this.service.find(this));
    }

DAO中只负责和数据源打交道,我们将逻辑全部转到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 阅读(744) 评论(0)  编辑  收藏 所属分类: 网络文摘

只有注册用户登录后才能发表评论。


网站导航:
 

<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

留言簿

随笔档案(1)

文章分类(44)

文章档案(46)

收藏夹(1)

Adobe

AOP

API

appServer

BI

c

  • c-free
  • codeblocks
  • codelite
  • CodeLite IDE 是一个强大的开源,跨平台的 C/C++整合开发环境. 支持包括 Windows、Linux 和 Mac 系统下运行
  • codelite官网
  • dev-c++
  • Dev-C++是一个C&C++开发工具,它是一款自由软件,遵守GPL协议。
  • GCC
  • GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 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原型设计

w3c

Wap

webservice

xml

供应链管理

博客链接

好网站

工作流

开源网

招聘

插件下载

操作系统

构建可伸缩的系统

构建工具

测试

  • IETest
  • IE官网
  • OpenSTA
  • Siege
  • Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力

游戏

源码托管

经营

资源

金融/财务

搜索

  •  

最新评论