getSession()与getHibernateTemplate()区别

getSession()与getHibernateTemplate()区别


一直都很疑惑在spring框架中getSession与getHibernateTemplate的区别。相同的地方不用说大家都是调用数据库返回结果的。但为什么要这样有二个不同的兄弟呢。认真学习了一下(其实还是很粗略的)

从使用上看

getHibernateTemplate必须继承或实例HibernateDaoSupport当然包括sessionFactory

Java代码 
@SuppressWarnings ( "unchecked" )   
     public T get(String id) {   
         T ret = (T) getHibernateTemplate().get(type, id);   
         if (ret == null ) {   
             throw new ObjectRetrievalFailureException(type,   
                     "can't get object with id " + id);   
         }   
         return ret;   
     }   
public IResponseDataNPage findPageByCriteria(   
             final DetachedCriteria detachedCriteria, final Order order,   
             final int pageSize, final int startIndex)   {   
         return (IResponseDataNPage) getHibernateTemplate().execute(   
                 new HibernateCallback() {   
                     public Object doInHibernate(Session session)   
                             throws HibernateException {   
                         Criteria criteria = detachedCriteria   
                                 .getExecutableCriteria(session);   
                         int totalCount = ((Integer) criteria.setProjection(   
                                 Projections.rowCount()).uniqueResult())   
                                 .intValue();   
                         criteria.setProjection( null );   
                         if (order != null )   
                             criteria.addOrder(order);   
                         if (pageSize> 0 && startIndex>= 0 )   
                         {   
                             criteria.setFirstResult(startIndex).setMaxResults(   
                                     pageSize);   
                         }   
                           
                         List items = getHibernateTemplate().findByCriteria(   
                                 detachedCriteria);   
                         // IResponseDataNPage ps = new IResponseDataNPage(items,   
                         // totalCount, pageSize, startIndex);   
                         IResponseDataNPage dataNPage = buildResponseDataNPage(   
                                 null , items, totalCount);   
                         return dataNPage;   
                     }   
                 }, true );   
     }   
       
  
}  
@SuppressWarnings("unchecked")
 public T get(String id) {
  T ret = (T) getHibernateTemplate().get(type, id);
  if (ret == null) {
   throw new ObjectRetrievalFailureException(type,
     "can't get object with id " + id);
  }
  return ret;
 }
public IResponseDataNPage findPageByCriteria(
   final DetachedCriteria detachedCriteria, final Order order,
   final int pageSize, final int startIndex)  {
  return (IResponseDataNPage) getHibernateTemplate().execute(
    new HibernateCallback() {
     public Object doInHibernate(Session session)
       throws HibernateException {
      Criteria criteria = detachedCriteria
        .getExecutableCriteria(session);
      int totalCount = ((Integer) criteria.setProjection(
        Projections.rowCount()).uniqueResult())
        .intValue();
      criteria.setProjection(null);
      if (order != null)
       criteria.addOrder(order);
      if(pageSize>0 && startIndex>=0)
      {
       criteria.setFirstResult(startIndex).setMaxResults(
         pageSize);
      }
     
      List items = getHibernateTemplate().findByCriteria(
        detachedCriteria);
      // IResponseDataNPage ps = new IResponseDataNPage(items,
      // totalCount, pageSize, startIndex);
      IResponseDataNPage dataNPage = buildResponseDataNPage(
        null, items, totalCount);
      return dataNPage;
     }
    }, true);
 }
 

}getSession只有sessionFactory

Java代码 
public T get( final PK id) {   
         return (T) getSession().load(entityClass, id);   
     }   
     public Page<T> find(Page<T> page, String hql, Object... values) {   
         Assert.notNull(page);   
         Query q = createQuery(hql, values);   
         if (page.isFirstSetted()) {   
             q.setFirstResult(page.getFirst());   
         }   
         if (page.isPageSizeSetted()) {   
             q.setMaxResults(page.getPageSize());   
         }   
         page.setResult(q.list());   
         return page;   
     }  
public T get(final PK id) {
  return (T) getSession().load(entityClass, id);
 }
 public Page<T> find(Page<T> page, String hql, Object... values) {
  Assert.notNull(page);
  Query q = createQuery(hql, values);
  if (page.isFirstSetted()) {
   q.setFirstResult(page.getFirst());
  }
  if (page.isPageSizeSetted()) {
   q.setMaxResults(page.getPageSize());
  }
  page.setResult(q.list());
  return page;
 }从上面可以看出getSession能实现与getHibernateTemplate完全一样的代码。

但getSession要自己实现一堆的功能。如createQuery等等。

但深入比较发现一下不同处:

getSession() 获得的是原始的sessionFactory,每次你必须自己维护session如结束后你必须关闭session。如果是hibernate中进行数据库操作,你获得是原始的hibernate style和excepttion。

而hibernate template是spring包装过的,它会帮你管理session,并且它会将hibernate exceptions转换成其他的分类后的错误。这点getSession是肯定不行了。例如你用orcle和mysql返回的错误在 getSession中就是不一样的,而在hibernate template中就是一样的。

但我在实际使用中发现,对于基本的操作Hibernate template处理的的确比getSession要好,但到了复杂查询的时候如分页时需要调用 getHibernateTemplate().execute(HibernateCallBack).要产生很多innerClass,调试非常不便。而getSession就相当简单多了。

总之:dao layer的设计五花八门,只能根据需要自己选择了。晕 java 的多态?还是变态?

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值