`
kerne
  • 浏览: 15016 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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

阅读更多
我一直在想,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太大了?
分享到:
评论
6 楼 oooboy 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是怎么依赖注入的啊?还是在项目配置文件中配置?
5 楼 kerne 2007-12-21  
ecsun 写道
在HibernateTemplate的源码里面,确实已经有sessionFactory了.我觉得在这里,我们没有必要再去做一些重复的工作,把DAO再重复实现一次, 对于一般的应用,Hibernate已经做的很好的,实际应用中,再加入分页啊,数据结构包装啊,转换啊,就可以了.懒人创造世界嘛~~


呵,你说得对,现在spring + hibernate时,spring给我们封装了一层HibernateDaoSupport,然后我们自己的实现都 XXXX extends HibernateDaoSupport,然后再得到HibernateTemplate.XXX方法,
而我现在的想法是,不能过HibernateDaoSupport直接拥有HibernateTemplate里所有的方法,所以我就想到了这样去实现。
4 楼 kerne 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>
3 楼 freemanxm84 2007-12-20  
应该是正解,哈哈
2 楼 wangxuliangboy 2007-12-19  
首先可以肯定你的想法是好的..

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


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

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


你的那个createHibernateTemplate的方法的话...也可以不用在new啦.
直接返回return this就行啦..
1 楼 kerne 2007-12-18  
没有哪位大哥指点一下嘛!

相关推荐

    泛型dao 泛型dao 泛型dao

    Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...

    系统配置文件 dao350和dao360

    标题中的“系统配置文件 dao350和dao360”指的是Microsoft Office系统中的数据库访问对象(DAO,Database Access Objects)版本350和360。DAO是Microsoft Jet数据库引擎的一部分,主要用于与Access数据库或其他Jet...

    DAO3.6中文参考

    从DAO过渡到ADO(ActiveX Data Objects)是后来的一个趋势,因为ADO提供了更多的功能和更广泛的数据库支持。 通过DAO3.6中文参考,学习者可以深入了解如何使用DAO进行数据库编程,掌握Access 97中数据库操作的基本...

    idea的mybatis插件支持从dao到maper

    本文将详细介绍Idea的Mybatis插件及其如何帮助我们从DAO层直接进入Mapper文件,从而实现更便捷的Mybatis相关DAO到Mapper的开发。 MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis...

    SSH中通用dao类

    在SSH项目中,可以创建一个基类`HibernateDAO`,包含如`save()`, `update()`, `delete()`, `getById()`等基本操作,然后其他特定业务的DAO继承自这个基类,以实现通用性和重用性。 3. **设计模式的应用**:通用DAO...

    Java中Dao模式实例

    Java中的DAO(Data Access Object)模式是一种常用的软件设计模式,用于封装对数据库的操作,使得业务逻辑层与数据访问层解耦。在这个实例中,我们将深入探讨DAO模式的原理、实现方式以及它在实际项目中的作用。 ...

    Dao Jet数据库引擎

    3. 安装过程中,系统会自动检测并修复DAO相关组件的问题,或者将缺失的组件安装到系统中。 4. 完成安装后,可能需要重启计算机以使更改生效。 5. 验证DAO是否正常工作,可以通过编写简单的VBA代码(Visual Basic for...

    JDBC中的 DAO

    **JDBC中的DAO模式** DAO(Data Access Object)模式是一种常用的设计模式,它在Java编程中用于处理数据库交互。DAO的主要目标是将业务逻辑与数据访问层进行解耦,提高代码的可重用性和可测试性。在JDBC中,DAO模式...

    Dao3.5数据库引擎

    DAO3.5是DAO的一个特定版本,它在Windows 95和Windows 98时代非常流行,但在后来的系统中逐渐被ADO(ActiveX Data Objects)取代。 DAO3.5数据库引擎是MCGS(Made in China Generating System)组态软件进行数据...

    dao3.5数据库+引擎.zip

    DAO 3.5是DAO的一个版本,它在Windows操作系统中广泛使用,尤其是在16位和32位应用程序中。这个压缩包文件"dao3.5数据库+引擎.zip"包含了两个重要的组件:DAO 3.5数据库安装程序和DAO 3.5数据库引擎文件。 1. DAO ...

    dao3.5数据库安装文件

    安装完成后,DAO库将被添加到开发环境中,供编写数据库驱动的应用程序时使用。 请注意,随着技术的发展,DAO已被ADO(ActiveX Data Objects)所取代,后者提供了更强大的功能和对更多数据库系统的支持。然而,在...

    DAO详解 详细讲述了DAO的使用

    - **易维护**:修改数据访问逻辑时,只需改动DAO实现类,不会影响到业务层代码。 - **事务管理**:DAO层方便进行事务控制,确保数据的一致性。 **4. DAO的实现方式** - **JDBC DAO**:直接使用Java的JDBC API实现,...

    dao jet数据库引擎

    当你的计算机上缺失这个组件时,依赖DAO接口来访问Jet数据库的应用程序可能会出现问题,例如描述中提到的"无法对DAO/Jet db引擎进行初始化"的错误。这个问题通常意味着系统缺少必要的DLL文件或者注册表项没有正确...

    Hibernate中的DAO模式

    **DAO(Data Access Object)模式**是软件设计模式中用于处理数据访问的一种方式,它将业务逻辑与数据访问层分离,提高代码的可重用性和可维护性。在Java领域,尤其是在企业级应用开发中,DAO模式常与ORM(Object-...

    Hibernate_通用DAO模式,一个写好的dao层

    在Java Web开发中,DAO(Data Access Object)模式是一种常用的设计模式,用于封装对数据库的操作,使得业务逻辑层与数据访问层分离,提高代码的可重用性和可维护性。本资源“Hibernate_通用DAO模式”提供了一种适用...

    jsp中调用dao的getHibernateTemplate()时,报空指针

    这样,DAO 对象中继承自 HibernateDaoSupport 的属性并没有被正确地初始化,导致 getHibernateTemplate() 方法返回空值。 解决这个问题的方法是,从 Spring 配置文件中获取 ApplicationContext 对象,然后从中获取 ...

    使用junit测试ssh中的dao

    标题“使用junit测试ssh中的dao”涉及到的是Java开发中的单元测试技术,特别是针对SSH(Struts2、Spring、Hibernate)框架中的数据访问对象(DAO)进行测试。SSH是Java Web开发中常用的三大开源框架,它们协同工作以...

    DAO35资源比

    DAO35资源比是数据库访问对象(DAO)与磁盘空间占用比例的一个术语,主要出现在早期的Microsoft Access数据库系统中。DAO(Database Access Objects)是Microsoft Jet数据库引擎的一部分,用于在Visual Basic等编程...

    DAO设计模式(工厂+代理)

    DAO(Data Access Object)设计模式是一种在软件工程中常见的用于处理数据访问的模式,它将业务逻辑和数据访问逻辑分离,使得系统更加模块化,提高了代码的可复用性和可测试性。在这个“DAO设计模式(工厂+代理)”...

Global site tag (gtag.js) - Google Analytics