论坛首页 Java企业应用论坛

spring+hibernate中公共DAO的抽象问题。

浏览 26061 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-12-07  
DAO
package com.jctx.trms.hibernate.DAO;

import java.io.Serializable;
import java.util.List;

/**
 * 公共的DAO
 */
public interface DAO {

    public List find(String queryString);;
    
    public List getObjects(Class clazz);;

    public Object getObject(Class clazz, Serializable id);;

    public void saveObject(Object o);;

    public void removeObject(Class clazz, Serializable id);;
}


//DAO实现类
package com.jctx.trms.hibernate.DAO;

import java.io.Serializable;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;

public class BaseDAOHibernate extends HibernateDaoSupport implements DAO {
    protected final Log log = LogFactory.getLog(getClass(););;

    
    public List find(String queryString);{
        return getHibernateTemplate();.find(queryString);;
    }
    
    public void saveObject(Object o); {
        getHibernateTemplate();.saveOrUpdate(o);;
    }

    public Object getObject(Class clazz, Serializable id); {
        Object o = getHibernateTemplate();.get(clazz, id);;

        if (o == null); {
            throw new ObjectRetrievalFailureException(clazz, id);;
        }

        return o;
    }

    public List getObjects(Class clazz); {
        return getHibernateTemplate();.loadAll(clazz);;
    }

    public void removeObject(Class clazz, Serializable id); {
        getHibernateTemplate();.delete(getObject(clazz, id););;
    }
}


因为这个DAO接口中可以封装很多公共的方法,所以可不可以把它作为一个公共的DAO接口,把BaseDAOHibernate 作为一个公共的DAO实现类,不想再给各种业务(比如用户模块,产品模块。。)再单作DAO接口和DAO实现类了,所有的业务统统的用这个两个DAO就行了,各种需要的方法都可以封装进DAO接口,不知道这样做好不好??
   发表时间:2004-12-07  
你是说所有的数据库操作都通过这个dao来做?那查询的时候queryString由谁来生成?这个hql可是和hibernate相关的。你的业务对象难道要知道这个么?用DAO有时就是想得到一个明确的接口,传进去业务相关的参数,就能得到想得到的业务对象,而不是传一个和持久层相关而和业务层无关的hql。这样的封装窃以为是有问题的,虽然很大程度上减少了dao的类个数。
0 请登录后投票
   发表时间:2004-12-07  
可以自己写个类继承HibernateDaoSupport,然后加入你的方法,这样也挺方便的.

推荐看看这个:

Spring的DAO设计实践

http://forum.iteye.com/viewtopic.php?t=8224
0 请登录后投票
   发表时间:2004-12-07  
de3light 写道
你是说所有的数据库操作都通过这个dao来做?那查询的时候queryString由谁来生成?这个hql可是和hibernate相关的。你的业务对象难道要知道这个么?用DAO有时就是想得到一个明确的接口,传进去业务相关的参数,就能得到想得到的业务对象,而不是传一个和持久层相关而和业务层无关的hql。这样的封装窃以为是有问题的,虽然很大程度上减少了dao的类个数。

是的,想都通过这个DAO,查询字符串作为参数从调用DAO的地方传进来。
0 请登录后投票
   发表时间:2004-12-07  
hitdemo 写道
de3light 写道
你是说所有的数据库操作都通过这个dao来做?那查询的时候queryString由谁来生成?这个hql可是和hibernate相关的。你的业务对象难道要知道这个么?用DAO有时就是想得到一个明确的接口,传进去业务相关的参数,就能得到想得到的业务对象,而不是传一个和持久层相关而和业务层无关的hql。这样的封装窃以为是有问题的,虽然很大程度上减少了dao的类个数。

是的,想都通过这个DAO,查询字符串作为参数从调用DAO的地方传进来。


那你还假惺惺的做这么个DAO干吗呢?反正还不是HQL满天飞,还不如把session pool暴露在外面,谁需要查谁就去拿session。
0 请登录后投票
   发表时间:2004-12-07  
hitdemo 写道
de3light 写道
你是说所有的数据库操作都通过这个dao来做?那查询的时候queryString由谁来生成?这个hql可是和hibernate相关的。你的业务对象难道要知道这个么?用DAO有时就是想得到一个明确的接口,传进去业务相关的参数,就能得到想得到的业务对象,而不是传一个和持久层相关而和业务层无关的hql。这样的封装窃以为是有问题的,虽然很大程度上减少了dao的类个数。

是的,想都通过这个DAO,查询字符串作为参数从调用DAO的地方传进来。

这样的话,业务就和hibernate绑定了,dao也就失去了作用.
dao无非是把取数逻辑封装起来,这样倒好,你直接把取数的hql传给它,那dao作什么事情呢,只是执行hql吗?
所以这方法肯定是不行的
0 请登录后投票
   发表时间:2004-12-07  
你把DAO的意思理解错了。
0 请登录后投票
   发表时间:2004-12-07  
如果想减少接口,我觉得把一些通用取数逻辑封装起来成为baseDAOIF,如果有业务特殊的接口,在去扩展它,如果没有,就用它,这样倒是个可行的办法
public interface IBaseDAO {
   Object create(Object entity);;
   Object load(Object id);;
   ..
   update();;
   delete();;
   loadAll();;
...
}

public interface IAgentDAO extends IBaseDAO {
   Collection getAgentByName();;
   }


个人觉得没有必要去考虑什么简化dao的设计了,现在使用spring已经比较简化了,只需要一个interface一个class.
设计不是从简化dao设计开始的,重点放到业务对象的设计上去把~~
0 请登录后投票
   发表时间:2004-12-07  
我现在做东西常常没有DAO,毕竟hibernate已经把数据存取简化到相当简单了。比如我最近做的一个东西,管理用户相关的信息就一个UserManagerHibernateImpl,看名字就知道是怎么回事:实现UserManager接口,继承HibernateDAOSupport类。这个类我还打算要换实现的,回头可能做一个UserManagerHessianImpl,我考虑做几个Template Method或者再加上一层DAO。如果是不太可能换实现,一定是走关系数据库,基本上这样就够用了。像楼主做的贫血DAO,我觉得还不如不要。
0 请登录后投票
   发表时间:2004-12-07  
不同意Gigix把DAO做成那么薄的一层,DAO的目的就是隐藏数据访问细节不是吗?那么写HQL意义何在呢?

Spring+Hibernate的DAO的模板可以使用Hibernate Synchronizer来生成,如果对velocity比较熟悉的话(Hibernate Synchronizer是使用velocity来做模板的),可以自己修改一下Hibernate Synchronizer的模板文件来更改生成

不知道为什么这里的人都对Hibernate Synchronizer没什么兴趣,我觉得挺好用的,它基于模板的代码生成很方便,而且还能生成DAO,如果模板方法配置的好,DAO层几乎不用编码

我在这里发的更改Hibernate Synchronizer的模板来自动生成Spring+Hibernate的文章都没有人回:(
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics