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 BaseDaoImplextends GenericDAOImpl implements BaseDao
public class PersonDaoImpl extends BaseDaoImpl
这样的使用方式在
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)); }
这样做的好处是支持多重继承,任然可以初始化泛型.坏处是泛型的命名一定要与基类相同.