zoukankan      html  css  js  c++  java
  • 关于HibernateGenericDAO 的一点补充

    HibernateGenericDAO 

    dao的实现用继承:

    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));
            }

    这样做的好处是支持多重继承,任然可以初始化泛型.坏处是泛型的命名一定要与基类相同.














  • 相关阅读:
    Putty·Network error:Software caused connection abort
    VSCode·搭建Java开发环境
    MSSQL·将一对多的数据合并为以指定分隔符的数据
    技能Get·Windows10将任何格式文件固定到开始屏幕
    MSSQL·查询TSQL语句执行时间的三种方法
    Javac·编码GBK的不可映射字符
    傅里叶变换、拉氏变换、z变换的含义
    宏、内联函数和普通函数的区别
    OpenGL中创建GLUT菜单
    在PC安裝Android系統+軟體
  • 原文地址:https://www.cnblogs.com/fengyexjtu/p/5140939.html
Copyright © 2011-2022 走看看