`
gstarwd
  • 浏览: 1488254 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

getSession()与getHibernateTemplate()区别

    博客分类:
  • SSH
阅读更多
getSession()与getHibernateTemplate()区别
2009-01-09 16:32

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

从使用上看

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

Java代码 复制代码
  1. @SuppressWarnings ( "unchecked" )   
  2.      public T get(String id) {   
  3.          T 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.                                  null , items, 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代码 复制代码
  1. public T get( final PK id) {   
  2.          return (T) getSession().load(entityClass, id);   
  3.      }   
  4.      public Page<T> find(Page<T> page, String hql, Object... values) {   
  5.          Assert.notNull(page);   
  6.          Query q = 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<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 的多态?还是变态?

分享到:
评论

相关推荐

    request.getSession().doc

    request.getSession().doc

    java 中 request.getSession(true、false、null)的区别

    主要介绍了java 中 request.getSession(true/false/null)的区别的相关资料,需要的朋友可以参考下

    jsp 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)

    在网上经常看到有人对request.getSession(false)提出疑问,我第一次也很迷惑,看了一下J2EE1.3 API,看一下官网是怎么解释的。

    Intent启动服务的示例代码

    Intent启动服务的示例代码Intent启动服务的示例代码 startService,stopService,bindService.unbindService用法的比较

    自己实现的spring-session

    使用filter拦截用户的请求,在filter中包装request,在request的包装类requestWrapper中,重写getSession(), 和getSession(boolean create)。自己实现httpSession,在getSession中获取cookie,从cookie中读取...

    java 同一用户不能同时登陆问题

    if (httpssessionmap.containsKey(userid)&&httpssessionmap.get(userid).equals(event.getSession())) { //userIds.remove(userid); httpssessionmap.remove(userid); if(u!=null && userid....

    hibernate的flush机制

    对hibernate的flush机制有兴趣可以看看

    基于servlet的购物车

    Map, Book&gt; books = (Map, Book&gt;)request.getSession().getServletContext().getAttribute("books"); Book book = books.get(bookid); System.out.println(book); //得到数量 int bookNum = Integer....

    数据库连接工厂 JdbcFactory

    数据库连接工厂数据库连接工厂数据库连接工厂数据库连接工厂

    Spring使用技巧

    --------------=======Spring 使用技巧========---------...//通过this.getSession()取得Session; Session session = this.getSession(); conn = session.connection(); ...(正常执行SQL,使用方法和JDBC使用方法一致)

    Java异常的捕获及处理

    mldn中李新华老师关于Java异常的捕获及处理的课堂记录

    网络应用开发 之实现用户登录功能

    HashMap, Integer&gt; map = (HashMap, Integer&gt;) req.getSession().getAttribute("sessionGoods"); 3.写入链接a标签实现对映射的访问 out.write("&lt;a href='./ShowGoods'&gt;&lt;h1&gt;继续购买&lt;/h1&gt;&lt;/a&gt;");

    学生信息管理系统

    request getSession setAttribute &quot;mess&quot; &quot;恭喜 注册成功 &quot; ; response sendRedirect &quot;login jsp&quot; ; }else{ response sendRedirect &quot;error jsp&quot; ; } }...

    关于jsp语法和练习

    request.getSession (). GetAttributes() 答案: A 2. JSP页面需要创建仅在本页面使用的JavaBean的示例,为了完成此功能必须使用jsp:useBean的哪两个属性进行设置?(选择两个选项) A. id B. type C. name D. ...

    request.setAttribute 语句前总显示红色感叹号解决办法 HTTP Status 500 -

    type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception javax.servlet.ServletException: Servlet execution ...

    python:接口间数据传递与调用方法

    from pubulic_way.get_token import getSession class testlogin(unittest.TestCase): def test_getIdentify(self): '''调用test_listCollectInfoByCreditId(self)响应数据中的taxid参数''' result = self.get_...

    javaweb 做图片水印,水印图片到目录图片上去

    String planeImage = request.getSession().getServletContext().getRealPath("/image").replace("\\", "/")+"/"+"symark.png"; //获取目标图片的路径String targetPic = request.getSession().getServletContext()....

    servlet中session简介和使用例子

    HttpServletRequest有两个重载的getSession()方法,一个接受一个boolean的类型的值,另一个不带任何参数,getSession()方法和getSession(true)方法功能一样,就是如果对应的客户端已经产生过一个session,那么就会...

    网上购物系统设计与实现

    HttpSession session=requ.getSession(); if(session.getAttribute("admin")==null){ PrintWriter out=res.getWriter(); out.println("[removed]"); out.println("alert&#40;'您还没有登录!'&#41;;"); out....

Global site tag (gtag.js) - Google Analytics