关于HibernateGenericDAO 的一点补充
2016-01-19 01:02
204 查看
HibernateGenericDAOdao的实现用继承:com.googlecode.genericdao.dao.hibernate.GenericDAOImpl<Book, String>注意几点:1.继承时必须声明泛型的具体类.如上的 <Book, String>.HibernateGenericDAO 会调用com.googlecode.genericdao.dao.DAOUtil的getTypeArguments 方法对泛型进行初始化.2.书写setSessionFactory()方法调用父类的setSessionFactory()来初始化sessionFactory.如果想自己再写一个BaseDao继承GenericDAOImpl,并初始化sessionFactory,是做不到的.因为DAOUtil中的getTypeArguments()方法会获取不到泛型.故而,我用了一个折中的方法.稍微改变了以下DAOUtil中的getTypeArguments()方法.其中的关键处在于
while (resolvedTypes.containsKey(baseType)) { baseType = resolvedTypes.get(baseType); }baseType是一个type类型的.在该源码中使用的是java.lang.reflect.TypeVariable的实现sun.reflect.generics.reflectiveObjects.TypeVariableImpl.其中的比较部分会先用GenericDeclaration进行比较.故而不是在GenericDAOImpl声明的泛型是无法初始化GenericDAOImpl上的泛型的.如:
public class BaseDaoImpl<T, ID extends Serializable> extends GenericDAOImpl implements BaseDao
public class PersonDaoImpl extends BaseDaoImpl<Person,Integer>这样的使用方式在
resolvedTypes.containsKey(baseType) 判断时,始终为false. 我的做法是只比较name的值.
for (Type type3 : resolvedTypes.keySet()) { if (((TypeVariable) type3).getName() .equals(((TypeVariable) baseType).getName())) { typeArgumentsAsClasses.add(getClass(resolvedTypes.get(type3))); } } while (resolvedTypes.containsKey(baseType)) { baseType = resolvedTypes.get(baseType); } if (getClass(baseType) != null) { typeArgumentsAsClasses.add(getClass(baseType)); }这样做的好处是支持多重继承,任然可以初始化泛型.坏处是泛型的命名一定要与基类相同.
相关文章推荐
- 动态规划-最大子矩阵和
- uva 10929 - You can say 11
- (一二一)第十章复习题
- Substring with Concatenation of All Words
- javascript捕获键盘组合事件
- (一二〇)抽象数据类型
- 疾病尚需用猛药
- 【C语言】冒泡排序及优化
- (一一九)类作用域
- 学习java的道路
- (一一八)对象数组
- hypervisor on vehicle
- 设计模式之代理模式(二结构型)
- (一一七)this指针
- http servlet服务器和android客户端(二)第一个android客户端
- 单例模式的应用
- 进程间通信(IPC) 之 共享内存 和 闲扯其他一些东西
- python3 crontab 下运行python输出中文失败
- MonoBehaviour继承类及其重要方法
- 敏捷开发解决方案