浏览 5048 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-12-18
我们的DAO也可以继承HibernateOperations接口,这样一来,我们是不是不用再重复写HibernateOperations接口里所有的方法了呢? 如果要扩展我们自己的方法可以写在Manager里,而Manager又可以继承我们的DAO,然后ManagerImpl可以再继承DAOImpl的。 这只是一个想法,也在实施中出错了。 一般的实现我们都会继承HibernateDaoSupport,然后再通过this.getHibernateTemplate().... 先不说那么多了,贴一下我的代码: 接口BaseDAO public interface BaseDAO extends HibernateOperations { } 实现BaseDAOImpl,并试图用HibernateDaoSupport里的方法在实现里注入sessionFactory public class BaseDAOImpl extends HibernateTemplate implements BaseDAO { /** * Set the Hibernate SessionFactory to be used by this DAO. * Will automatically create a HibernateTemplate for the given SessionFactory. * @see #createHibernateTemplate * @see #setHibernateTemplate */ public void setSessionFactory(SessionFactory sessionFactory) { this.createHibernateTemplate(sessionFactory); } /** * Create a HibernateTemplate for the given SessionFactory. * Only invoked if populating the DAO with a SessionFactory reference! * <p>Can be overridden in subclasses to provide a HibernateTemplate instance * with different configuration, or a custom HibernateTemplate subclass. * @param sessionFactory the Hibernate SessionFactory to create a HibernateTemplate for * @return the new HibernateTemplate instance * @see #setSessionFactory */ protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) { return new HibernateTemplate(sessionFactory); } /** * Return the Hibernate SessionFactory used by this DAO. */ public SessionFactory getSessionFactory() { return super.getSessionFactory(); } } 接口BaseManager ,这里用来扩展我们需要的方法,如分页。 public interface BaseManager extends BaseDAO { /** * 通过持久化对象类型,和输入参数,开始记录和查询记录数,返回查询列表 * @param entityClass Class * @param firstResult int * @param maxResult int * @return List */ public List findToPage(Class entityClass, int firstResult, int maxResult); } 实现BaseManagerImpl ,这里注入BaseDAO public class BaseManagerImpl extends BaseDAOImpl implements BaseManager { private BaseDAO baseDAO ; public BaseDAO getBaseDAO() { return baseDAO; } public void setBaseDAO(BaseDAO baseDAO) { this.baseDAO = baseDAO; } public List findToPage(Class entityClass, int firstResult, int maxResult) { baseDAO...... } } 我的代码就是这些,但是我在启动服务器时,告诉我注入sessionFactory注入错误,然后我又看了HibernateDaoSupport里面注入sessionFactory,接着拷贝,然后提示sessionFactory和baseDAO无法注入。 javaeye里的各位大哥们,我想实现这样的想法,需要怎么做呢? 这样的想法是否是对的,是不是DAO太大了? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-12-19
首先可以肯定你的想法是好的..
但是这里你写了一些没有必要的代码 BaseDaoImp 如果你继承了HibernateTemplate的话.就可以不要在里面在写一个SessionFactory的变量啦 因为HibernateTemplate本身就有一个一sessionFactory的变量..你直接注入就可以啦 你的那个createHibernateTemplate的方法的话...也可以不用在new啦. 直接返回return this就行啦.. |
|
返回顶楼 | |
发表时间:2007-12-20
应该是正解,哈哈
|
|
返回顶楼 | |
发表时间:2007-12-21
wangxuliangboy 写道 首先可以肯定你的想法是好的..
但是这里你写了一些没有必要的代码 BaseDaoImp 如果你继承了HibernateTemplate的话.就可以不要在里面在写一个SessionFactory的变量啦 因为HibernateTemplate本身就有一个一sessionFactory的变量..你直接注入就可以啦 你的那个createHibernateTemplate的方法的话...也可以不用在new啦. 直接返回return this就行啦.. 我之前也是这样想的,但是提示BaseManager不能注入,所以我改成了自己再设置一个SessionFactory,后来我仔细的研究了一下,原来是我的配置文件出错了,因为我没有对BaseManagerImpl extends BaseDAOImpl注入SessionFactory属性只注入了baseDAO,所以一直提示错误。 正确配置如下: <bean id="baseDAO" class="cn.graysky.general.BaseDAOImpl"> <property name="sessionFactory"> <ref bean="fireprdmanageSessionFactory"/> </property> </bean> <bean id="baseManager" class="cn.graysky.general.BaseManagerImpl"> <property name="baseDAO"> <ref bean="baseDAO"/> </property> <property name="sessionFactory"> <ref bean="fireprdmanageSessionFactory"/> </property> </bean> |
|
返回顶楼 | |
发表时间:2007-12-21
ecsun 写道 在HibernateTemplate的源码里面,确实已经有sessionFactory了.我觉得在这里,我们没有必要再去做一些重复的工作,把DAO再重复实现一次, 对于一般的应用,Hibernate已经做的很好的,实际应用中,再加入分页啊,数据结构包装啊,转换啊,就可以了.懒人创造世界嘛~~
呵,你说得对,现在spring + hibernate时,spring给我们封装了一层HibernateDaoSupport,然后我们自己的实现都 XXXX extends HibernateDaoSupport,然后再得到HibernateTemplate.XXX方法, 而我现在的想法是,不能过HibernateDaoSupport直接拥有HibernateTemplate里所有的方法,所以我就想到了这样去实现。 |
|
返回顶楼 | |
发表时间:2008-01-05
如果把BaseDao和BaseService写在项目中间。只要在配置文件中配一下差不多了。如果我想把BaseDao和BaseService做成一个jar文件包导入到项目中
public class BaseServiceImpl<T> implements BaseService<T> { BaseDAO<T> baseDAO; public void setBaseDAO(BaseDAO<T> baseDAO) { this.baseDAO = baseDAO; } ........ } 对于BaseService是需要spring注入BaseDao,请问做成jar文件中BaseDao和BaseService是怎么依赖注入的啊?还是在项目配置文件中配置? |
|
返回顶楼 | |