精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-12-07
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接口,不知道这样做好不好?? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-12-07
你是说所有的数据库操作都通过这个dao来做?那查询的时候queryString由谁来生成?这个hql可是和hibernate相关的。你的业务对象难道要知道这个么?用DAO有时就是想得到一个明确的接口,传进去业务相关的参数,就能得到想得到的业务对象,而不是传一个和持久层相关而和业务层无关的hql。这样的封装窃以为是有问题的,虽然很大程度上减少了dao的类个数。
|
|
返回顶楼 | |
发表时间:2004-12-07
可以自己写个类继承HibernateDaoSupport,然后加入你的方法,这样也挺方便的.
推荐看看这个: Spring的DAO设计实践 http://forum.iteye.com/viewtopic.php?t=8224 |
|
返回顶楼 | |
发表时间:2004-12-07
de3light 写道 你是说所有的数据库操作都通过这个dao来做?那查询的时候queryString由谁来生成?这个hql可是和hibernate相关的。你的业务对象难道要知道这个么?用DAO有时就是想得到一个明确的接口,传进去业务相关的参数,就能得到想得到的业务对象,而不是传一个和持久层相关而和业务层无关的hql。这样的封装窃以为是有问题的,虽然很大程度上减少了dao的类个数。
是的,想都通过这个DAO,查询字符串作为参数从调用DAO的地方传进来。 |
|
返回顶楼 | |
发表时间:2004-12-07
hitdemo 写道 de3light 写道 你是说所有的数据库操作都通过这个dao来做?那查询的时候queryString由谁来生成?这个hql可是和hibernate相关的。你的业务对象难道要知道这个么?用DAO有时就是想得到一个明确的接口,传进去业务相关的参数,就能得到想得到的业务对象,而不是传一个和持久层相关而和业务层无关的hql。这样的封装窃以为是有问题的,虽然很大程度上减少了dao的类个数。
是的,想都通过这个DAO,查询字符串作为参数从调用DAO的地方传进来。 那你还假惺惺的做这么个DAO干吗呢?反正还不是HQL满天飞,还不如把session pool暴露在外面,谁需要查谁就去拿session。 |
|
返回顶楼 | |
发表时间:2004-12-07
hitdemo 写道 de3light 写道 你是说所有的数据库操作都通过这个dao来做?那查询的时候queryString由谁来生成?这个hql可是和hibernate相关的。你的业务对象难道要知道这个么?用DAO有时就是想得到一个明确的接口,传进去业务相关的参数,就能得到想得到的业务对象,而不是传一个和持久层相关而和业务层无关的hql。这样的封装窃以为是有问题的,虽然很大程度上减少了dao的类个数。
是的,想都通过这个DAO,查询字符串作为参数从调用DAO的地方传进来。 这样的话,业务就和hibernate绑定了,dao也就失去了作用. dao无非是把取数逻辑封装起来,这样倒好,你直接把取数的hql传给它,那dao作什么事情呢,只是执行hql吗? 所以这方法肯定是不行的 |
|
返回顶楼 | |
发表时间:2004-12-07
你把DAO的意思理解错了。
|
|
返回顶楼 | |
发表时间: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设计开始的,重点放到业务对象的设计上去把~~ |
|
返回顶楼 | |
发表时间:2004-12-07
我现在做东西常常没有DAO,毕竟hibernate已经把数据存取简化到相当简单了。比如我最近做的一个东西,管理用户相关的信息就一个UserManagerHibernateImpl,看名字就知道是怎么回事:实现UserManager接口,继承HibernateDAOSupport类。这个类我还打算要换实现的,回头可能做一个UserManagerHessianImpl,我考虑做几个Template Method或者再加上一层DAO。如果是不太可能换实现,一定是走关系数据库,基本上这样就够用了。像楼主做的贫血DAO,我觉得还不如不要。
|
|
返回顶楼 | |
发表时间: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的文章都没有人回:( |
|
返回顶楼 | |