关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值