论坛首页 Java企业应用论坛

我的DAO 继承 HibernateOperations,想法到实施中出错。

浏览 5048 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-18  
我一直在想,Spring 里的 HibernateTemplate 已经做得很完善了,为什么我们的实现不也继承他呢?
我们的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太大了?
   发表时间:2007-12-19  
首先可以肯定你的想法是好的..

但是这里你写了一些没有必要的代码


BaseDaoImp
如果你继承了HibernateTemplate的话.就可以不要在里面在写一个SessionFactory的变量啦

因为HibernateTemplate本身就有一个一sessionFactory的变量..你直接注入就可以啦


你的那个createHibernateTemplate的方法的话...也可以不用在new啦.
直接返回return this就行啦..
0 请登录后投票
   发表时间:2007-12-20  
应该是正解,哈哈
0 请登录后投票
   发表时间: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>
0 请登录后投票
   发表时间:2007-12-21  
ecsun 写道
在HibernateTemplate的源码里面,确实已经有sessionFactory了.我觉得在这里,我们没有必要再去做一些重复的工作,把DAO再重复实现一次, 对于一般的应用,Hibernate已经做的很好的,实际应用中,再加入分页啊,数据结构包装啊,转换啊,就可以了.懒人创造世界嘛~~


呵,你说得对,现在spring + hibernate时,spring给我们封装了一层HibernateDaoSupport,然后我们自己的实现都 XXXX extends HibernateDaoSupport,然后再得到HibernateTemplate.XXX方法,
而我现在的想法是,不能过HibernateDaoSupport直接拥有HibernateTemplate里所有的方法,所以我就想到了这样去实现。
0 请登录后投票
   发表时间: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是怎么依赖注入的啊?还是在项目配置文件中配置?
0 请登录后投票
论坛首页 Java企业应用版

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