不知道为什么这样写,一般用回调是为了实现如分页等直接用hibernatetemplate不能实现的时候

解决方案 »

  1.   

    我的意思是,就算是分页,都是需要Query,倒不如直接用Query q = this.getSession().createQuery(sql); 这样就不必用HibernateCallback()了.但是我看很多人都放弃捷径不走,情愿用HibernateCallback,我就想知道这个原因是什么?
      

  2.   

    你当然可以直接使用Query。但是问题是HibernateTemplate提供了相当多有用的辅助功能。我们想用它提供的辅助功能。但是HibernateTemplate包装了Hibernate的代码,使用了它以后不能直接访问到Session了,也就是说,我们无法通过Session对象得到Query了。所以,这种情况下我们当然无法直接用Query来查询了。HibernateTemplate提供这个HibernateCallback,就是为了满足这种使用了HibernateTemplate的情况下,仍然需要直接访问Session的需求而来的。它提供了在HibernateTemplate里面直接访问Session的能力。这个就是我们要使用HibernateCallback的原因。最后提醒一下楼主,HibernateCallback是一个对象,而不是一个方法...
      

  3.   

    我看了一下楼主的代码,好像你的代码既能得到HibernateTemplate,也能得到Session(this.getSession)。我个人认为这种代码一定有隐患。至少,在代码风格上是不好的。
      

  4.   

    我们使用HibernateTemplate,有一个很重要的原因就在于我们不想直接控制事务,不想直接去获取,打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个Session。我们自己只专注于业务,不想去作这些重复而繁琐的操作。我们把这些责任全部委托给了HibernateTemplate,然后使用声明式的配置来实现这样的功能。如果我们通过类似getSession()这样的方法获得了Session,那就意味着我们放弃了上面所说的一切好处。所以,如果楼主的业务类如果在使用HibernateTemplate的同时,又可以直接得到Session(而不是通过HibernateCallback),那么我敢说楼主的代码一定有bug