论坛首页 Java版 DAO

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

浏览 16572 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2004-12-07
[code:1]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);
}[/code:1]

[code:1]//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));
    }
}[/code:1]

因为这个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.javaeye.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,如果有业务特殊的接口,在去扩展它,如果没有,就用它,这样倒是个可行的办法
[code:1]
public interface IBaseDAO {
   Object create(Object entity);
   Object load(Object id);
   ..
   update();
   delete();
   loadAll();
...
}
[/code:1]
[code:1]
public interface IAgentDAO extends IBaseDAO {
   Collection getAgentByName();
   }
[/code:1]

个人觉得没有必要去考虑什么简化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版 DAO

跳转论坛:
JavaEye推荐