您的位置:首页 > 其它

关于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));
}
这样做的好处是支持多重继承,任然可以初始化泛型.坏处是泛型的命名一定要与基类相同.

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: