论坛首页 Java企业应用论坛

谁能不使用匿名内部类写出这个方法

浏览 5011 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-12-02  
抱歉在这里使用了难看的匿名类
但是为了获得的Criteria和HibernateTemplate的是一个Session
也是没有办法,否则就会出现Illegal attempt to associate a collection with two open sessions错误
谁知道能够不通过内部调用解决这个问题

本以为只是查询,可以蒙混过关的(见注释掉代码)
在这里使用了HibernateTemplate的createCriteria而没有使用execute
是没有事务支持和异常管理的,但是考虑到Criteria执行的只是查询,这样用也算是能蒙混过关了
(但实际上,不行)

BTW:
如果老段进来,请注意一下你发的那些代码也有这个问题
如果Robbin进来,你在SpringDAO设计帖子中说的
引用
HibernateTemplate中的事务代码,如果你不用HibernateTemplate,那么似乎还是写上比较好

不知道你是否使用过这种方法?实际上这些是继承自HibernateAccessor,写在这里代码会比CallBack更难看,不知道你怎么看?


  /** 
     * 取特定大小记录集合 
     */ 
    protected Iterator getSomeObjects(final Class refClass,final int position, final int length); throws Exception {

        Iterator iterator = null;
        //查出的PO调用HibernateTemplate的delete(object)会报错的代码
        /*
        Criteria crit = getHibernateTemplate();.createCriteria(
                getSession();, refClass);;
        //设置游标的起始点
        crit.setFirstResult(position);;
        //设置游标的长度
        crit.setMaxResults(length);;
        iterator = crit.list();.iterator();;
        */
        List result = (List); getHibernateTemplate();.executeFind(
                new HibernateCallback(); {
                    public Object doInHibernate(Session session);
                            throws HibernateException {
                        Criteria crit = getHibernateTemplate();.createCriteria(
                                session, refClass);;
                        //设置游标的起始点
                        crit.setFirstResult(position);;
                        //设置游标的长度
                        crit.setMaxResults(length);;
                        return crit.list();;
                    }
                });;
        //查询到的结果放入迭代器
        iterator = result.iterator();;
        return iterator; 
    } 
   发表时间:2004-12-04  
请明白内部类的作用是什么。

获得是不是同一个session与内部类有关吗?只与实现的机制有关。

其实可以建议看一下spring的代码,这样你就会明白了。
0 请登录后投票
   发表时间:2004-12-04  
看一下 HibernateDaoSupport中getSession的代码,要获得session不一定要callback
0 请登录后投票
   发表时间:2004-12-04  
xiaoyu:
我明白内部类的作用,至于你说的
xiaoyu 写道

获得是不是同一个session与内部类有关吗?只与实现的机制有关。


没错,是与内部类没关系,但是我这里并没有说它于内部类有关系(你见到这样的文字了吗?)
我是说HibernateTemplate的实现机制把它和内部类绑到了一起
也就是说如果你使用HibernateTemplate,你就必须使用它的内部类
而不使用内部类的方法,Robbin在《Spring的DAO设计实践》一贴中也提出了相应的办法,但是我不知道他试验过没有,因为我感觉更麻烦,这里我不是要搞清楚该怎么做,而是想讨论为什么HibernateTemplate要采用这种实现方式,以及有没有更简单自然的方法
so,在回答前,请仔细考虑一下问题

BTW:
不知道你试验过我那段代码没有
从我注释掉那段代码中得到的List中的Object
如果你调用HibernateTemplate的delete(Object object)来删除的话
你就会得到一个
Illegal attempt to associate a collection with two open sessions
错误

这是POJO管理策略的问题
建议你看看Hibernate的PersistentCollection源码
0 请登录后投票
   发表时间:2004-12-04  
jjx 写道
看一下 HibernateDaoSupport中getSession的代码,要获得session不一定要callback


我说的是获得同一个Session
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics