[size=large]首先第一点[/size]
我的理想是,使用这个dao时,只需要像
BaseDao userDao = new BaseDao<UserPO, UserVO>();
这样,就可以用它操作我想要操作的数据库对象(PO),用我想要的返回类型或参数(VO)
可惜我发现,这只是理想.java中的泛型实现是擦除式的,我不知道什么叫擦除式,只知道后果像getVOClass()方法中用反射不能获得当前类的泛型类型信息,而只能通过getGenericSuperclass()方法取得父类,求得父类的泛型类型信息,所以为了getVOClass()方法可用,我就必须用子类继承此BaseDao类,比如:
public class UserDao extends BaseDao<UserPO, UserVO>{}
而这样我又要每个po,vo对都做一个子类,如果项目中对应一个po,我需要有多个vo,比如有个UserQueryVO,也是对应的UserPO,那又要有一个
public class UserDao extends BaseDao<UserPO, UserQueryVO>{}
而不能像
public class UserDao<PO,VO> extends BaseDao<PO, VO>{}
这样用这样的需求很多,岂不是类爆炸?
并且,像我一开始所说,我想要的是一个通用的dao,所以这里我放弃了反射获得泛型类型,用了构造方法传入class
public BaseDao(Class poClass, Class voClass){
this.poClass = poClass;
this.voClass = voClass;
}
用的时候可以这样
BaseDao userDao = new BaseDao<UserPO, UserVO>(UserPO.class, UserVO.class);
没有理想中那么简洁,但也算凑合吧.毕竟这样可以解决问题[size=large]然后第二点[/size]
这个类的创建方式又难倒了我,按照上面所说的,我可以new一个BaseDao,可是我总不能每次db操作都new一个BaseDao对象吧.所以我考虑写个Factory,封装创建和缓存BaseDao对象,可是却没有办法写
因为java的泛型类型我没找到怎么动态指定,也就是说<>中的类定义不能动态.比如public BaseDao createDao(Class poClass, Class voClass) throws Exception{
    return new BaseDao<poClass,voClass>(poClass, voClass);
}是不允许的我曾想过用spring注入,也google过资料,可是java语言本身都实现不了的东西,spring也没有办法现在的情况是,要么我每次数据库io都new一个BaseDao,要么用时到缓存去取,如果取不到的话再new一个,然后放到缓存中,如:BaseDao<UserPO, UserVO> userDao = DaoFactory.getDao(UserPO.class,UserVO.class);
if(null == userDao){
    userDao = new BaseDao<UserPO, UserVO>(UserPO.class,UserVO.class);
    DaoFactory.putDao(UserPO.class,UserVO.class, userDao);
}每次用时都要这么写,不能封装,就是因为new BaseDao<UserPO, UserVO>();这部分不能封装,这样做很惨的...
哪位能指教一下有什么更好更简便的解决方案或实现...

解决方案 »

  1.   

    BaseDao userDao = new BaseDao<UserPO, UserVO>(){};这样试试看
      

  2.   

    这个建议很好,虽然会产生一些inner class,但在编码角度要简洁一些了第二个问题还是没办法呀
      

  3.   

    对了,还有个问题,这样真接new BaseDao不行,因为还要用hibernate的sessionFactory
      

  4.   

    似乎都是这样,要么传entity要么就是继承,要么用刚才的inner还是需要个factory.似乎没有更好的解决方案
      

  5.   

    给BaseDao实现个接口,写上所有的方法定义,然后让所有想用BaseDao的类去实现那个接口
      

  6.   

    没必要自己折腾了,看看appfuse怎么做的吧
      

  7.   

    看看官方的教学吧http://www.hibernate.org/328.html