getSession与getHibernateTemplate…

本文探讨了Spring框架中getSession与getHibernateTemplate的区别。getHibernateTemplate由Spring封装,提供异常管理和Session管理,适用于基本操作;而getSession则提供原始Session,更适合复杂查询,但需自行管理Session。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

从使用上看

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

Java代码 复制代码  收藏代码getSession与getHibernateTemplate的区别
  1. @SuppressWarnings("unchecked")   
  2.     public get(String id) {   
  3.         ret (T) getHibernateTemplate().get(type, id);   
  4.         if (ret == null{   
  5.             throw new ObjectRetrievalFailureException(type,   
  6.                     "can't get object with id " id);   
  7.         }   
  8.         return ret;   
  9.     }   
  10. public IResponseDataNPage findPageByCriteria(   
  11.             final DetachedCriteria detachedCriteria, final Order order,   
  12.             final int pageSize, final int startIndex)  {   
  13.         return (IResponseDataNPage) getHibernateTemplate().execute(   
  14.                 new HibernateCallback() {   
  15.                     public Object doInHibernate(Session session)   
  16.                             throws HibernateException {   
  17.                         Criteria criteria detachedCriteria   
  18.                                 .getExecutableCriteria(session);   
  19.                         int totalCount ((Integer) criteria.setProjection(   
  20.                                 Projections.rowCount()).uniqueResult())   
  21.                                 .intValue();   
  22.                         criteria.setProjection(null);   
  23.                         if (order != null)   
  24.                             criteria.addOrder(order);   
  25.                         if(pageSize>0 && startIndex>=0)   
  26.                         {   
  27.                             criteria.setFirstResult(startIndex).setMaxResults(   
  28.                                     pageSize);   
  29.                         }   
  30.                            
  31.                         List items getHibernateTemplate().findByCriteria(   
  32.                                 detachedCriteria);   
  33.                         // IResponseDataNPage ps new IResponseDataNPage(items,   
  34.                         // totalCount, pageSize, startIndex);   
  35.                         IResponseDataNPage dataNPage buildResponseDataNPage(   
  36.                                 nullitems, totalCount);   
  37.                         return dataNPage;   
  38.                     }   
  39.                 }, true);   
  40.     }   
  41.        
  42.   
  43.  
@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代码 复制代码  收藏代码getSession与getHibernateTemplate的区别
  1. public get(final PK id) {   
  2.         return (T) getSession().load(entityClass, id);   
  3.     }   
  4.     public Page find(Page page, String hql, Object... values) {   
  5.         Assert.notNull(page);   
  6.         Query createQuery(hql, values);   
  7.         if (page.isFirstSetted()) {   
  8.             q.setFirstResult(page.getFirst());   
  9.         }   
  10.         if (page.isPageSizeSetted()) {   
  11.             q.setMaxResults(page.getPageSize());   
  12.         }   
  13.         page.setResult(q.list());   
  14.         return page;   
  15.      
public T get(final PK id) {
                return (T) getSession().load(entityClass, id);
        }
        public Page find(Page 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 的多态?还是变态?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangleijay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值