DAO层的BaseHibernateDao类支持泛型,其目的是使得 子类 声明其操作的Persistence Class,以获得完整的CRUD功能。例如:
public class UserDAO extends BaseHibernateDao<User> { User getUser(Integer userId) { return getObject(id);//method of BaseHibernateDao } }
但是,由于BaseDAOHibernate提供了丰富的CRUD功能,所以在大多数情况下,子类不需要扩展。由此,我们很自然的想到,每一个Manager类直接注入BaseHibernateDao(而不是它的子类):
public class UserManager extends BaseManager<User> { private BaseHibernateDao<User> dao; //getter and setter of dao property... //business methods public User getUserById(Integer id) { return getDao().getObject(id); } }
可实际上,这是不行的。BaseHibernateDao的 getObject方法会抛出NullPointerException。跟踪代码,发现,getObject()方法调用了 HibernateTemplate的get(Class,Serializable id)方法。为了拿到泛型的实际类型,使用了getEntityClass()方法,而getEntityClass()方法总是返回null。这是怎么 回事呢,我们看getEntityClass()的实现,发现,这方法调用了Class.getGenericSuperclass();该方法用于获取 超类中声明的泛型的实际类型。如果我们使用UserDAO,由于它继承了BaseDAOHibernate<User>,所以没有问题,而如 果直接用BaseDAOHibernate<User>,由于没有所谓的Superclass,所以entityClass总是null.
解决的办法是:如果Dao子类无需扩展BaseDAOHibernate,那么可以省略,用Manager类直接扩展 BaseDAOHibernate即可。这样作似乎破坏了分层体系,并且有滥用继承的嫌疑(造成Manager层与Dao层紧密耦合),同时也违反了 IOC一切都注入的思想。但是,其好处也是明显的,那就是 开发效率 高!
是呀,按照Rod和Appfuse的做法,一个CRUD要写5个类(DAO interface,DAO impl,Manager Interface,Manager impl, Action)和至少两个配置文件(applicationContext.xml,web层的配置),的确够麻烦,看人家ROR。
所以,我同意SS和白衣的看法:大多数项目或模块,可以省略一个Dao层,直接在Manager层继承BaseDAOHibernate即可。但 是,个人仍然提倡用一个ManagerInterface(SpringSide连这个也省了),因为这个Interface可以隔离Web层和 Manager+DAO层,在一定程度上,提高扩展性。
例子:
Interface UserManager extendes Manager<User> { User getUserById(int id); } public class UserManagerImpl extends BaseDAOHibernate<User> implements UserManager { public User getUserById(int id) { return getObject(id); } }
相关推荐
Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...
Java泛型机制详解 Java泛型是Java语言中的一种机制,用于在编译期检查类型安全。Java泛型的出现解决了Java早期版本中类型安全检查的缺陷。Java泛型的好处是可以在编译期检查类型安全,避免了运行时的...
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
最后,关于标签"源码"和"工具",这表明这篇博客可能详细讲解了如何使用源代码来实现这个泛型DAO,并且可能提到了一些使用Hibernate和其他相关工具(如Maven或IDEA)进行项目构建和调试的技巧。 总结来说,这个...
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
下面将详细解释Java泛型的基本概念、使用方式以及相关的知识点。 1. 泛型的基本概念: - 泛型是一种参数化类型,允许在定义类、接口和方法时使用类型参数,从而创建一种可以适用于多种类型的通用代码。 - 泛型的...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。本篇文章将带你入门Java泛型,通过实例深入理解其核心概念。 1. **泛型的基本概念** - 泛型...
Java泛型是Java语言中的一种重要机制,自从Java 1.5版本引入泛型以来,Java开发者可以更方便地编写类型安全的代码。泛型的引入解决了Java早期版本中类型不安全的问题,提高了Java语言的开发效率和安全性。 泛型的...
Java 泛型使用详细分析 Java 泛型是 Java 语言中的一种类型系统特性,允许开发者在编译期检查类型安全,以避免在运行时出现类型相关的错误。在本文中,我们将详细介绍 Java 泛型的使用方法和实现原理。 一、泛型的...
Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...
Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...
下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展历程** - **早期版本的局限**:在Java泛型出现之前,程序员通常使用Object作为容器类(如ArrayList、HashMap等)的默认类型...
泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和可读性。在`BaseDao.java`中,可能会定义一个泛型基类,如: ```java public abstract class BaseDao<T> { public...
【Java基础】泛型方法 - 右撇子 - 博客频道 - CSDN.NET