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

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














  • 相关阅读:
    c#和unity引擎的所有笔记
    C#笔记(十九)——委托和事件
    委托
    c#笔记(十七)——队列
    js正则表达式
    mysql分页
    springMVC
    hibernate与spring整合实现transaction
    spring aop
    about hibernate lazy load and solution
  • 原文地址:https://www.cnblogs.com/fengyexjtu/p/5140939.html
Copyright © 2011-2022 走看看