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

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














原文地址:https://www.cnblogs.com/fengyexjtu/p/5140939.html