HibernateTemplate用法&session的区别

HibernateTemplate用法

HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring 2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。下面是HibernateTemplate的常用方法简介:

◇ void delete(Object entity):删除指定持久化实例

◇ deleteAll(Collection entities):删除集合内全部持久化类实例

◇ find(String queryString):根据HQL查询字符串来返回实例集合

◇ findByNamedQuery(String queryName):根据命名查询返回实例集合

◇ get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例

◇ save(Object entity):保存新的实例

◇ saveOrUpdate(Object entity):根据实例状态,选择保存或者更新

◇ update(Object entity):更新实例的状态,要求entity是持久状态

◇ setMaxResults(int maxResults):设置分页的大小

下面是一个完整DAO类的源代码

public class PersonDAOHibernate implements PersonDAO

{

    //采用log4j来完成调试时的日志功能

     private static Log log = LogFactory.getLog(NewsDAOHibernate.class);

    //以私有的成员变量来保存SessionFactory。

    private SessionFactory sessionFactory;

    //以私有变量的方式保存HibernateTemplate

   private HibernateTemplate hibernateTemplate = null;

    //设值注入SessionFactory必需的setter方法

    public void setSessionFactory(SessionFactory sessionFactory)

    {

        this.sessionFactory = sessionFactory;

    }

    //初始化本DAO所需的HibernateTemplate

    public HIbernateTemplate getHibernateTemplate()

    {

        //首先,检查原来的hibernateTemplate实例是否还存在

         if ( hibernateTemplate == null)

        {

             //如果不存在,新建一个HibernateTemplate实例

               hibernateTemplate = new HibernateTemplate(sessionFactory);

         }

         return hibernateTemplate;

     }

    //返回全部的人的实例

    public List getPersons()

    {       

        //通过HibernateTemplate的find方法返回Person的全部实例

         return getHibernateTemplate().find("from Person");

    }

    /**

     * 根据主键返回特定实例

      * @ return 特定主键对应的Person实例

      * @ param 主键值

      */

     public News getNews(int personid)

     {

         return (Person)getHibernateTemplate().get(Person.class, new Integer(personid));

     }

    /**

     * @ person 需要保存的Person实例

      */

    public void savePerson(Person person)

    {                

        getHibernateTemplate().saveOrUpdate(person);

    }

    /**

     * @ param personid 需要删除Person实例的主键

      */

    public void removePerson(int personid)

    {

          //先加载特定实例

           Object p = getHibernateTemplate().load(Person.class, new Integer(personid));

          //删除特定实例

           getHibernateTemplate().delete(p);

    }

}

HibernateTemplate与session的区别

使用方法没有多大的区别

我们使用HibernateTemplate,有一个很重要的原因就在于我们不想直接控制事务,不想直接去获取,打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个Session。而HibernateTemplate 是将Hibernate操作进行封装,我们只要简单的掉用HibernateTemplate 对象,传入hql和参数,就获得查询接口,至于事务的开启,关闭,都交给HibernateTemplate  对象来处理我们自己只专注于业务,不想去作这些重复而繁琐的操作。我们把这些责任全部委托给了 HibernateTemplate,然后使用声明式的配置来实现这样的功能。如果我们通过类似getSession()这样的方法获得了Session,那就意味着我们放弃了上面所说的一切好处。

在使用Spring的时候 DAO类继承了 HibernateDaoSupport 类又因为HibernateDaoSupport 类里面有个属性 hibernateTemplate;所以就可以进行设置注,也就是Spring的一大优点面向切面式编程,进行设置注入,在Tomcat启动的时候由 Tomcat 加载 ApplicationContext.xml,配置文件给 hibernateTemplate赋值,这样的话就实现了,在使用某个对象之前不用给他实例化

 

以上内容转自网络:http://blog.163.com/zsq303288862@126/blog/static/9374596120111123576334/

 

以下内容转自网络:http://blog.csdn.net/leidengyan/article/details/5654489

今天学习了下HibernateTemplate 和HibernateDaoSupport的session的区别。HibernateTemplate类中的方法是spring封装了hibernate中的方法,在使用完了以后会自动释放session。而如果使用了HibernateDaoSupport的getSession方法,就需要配套的使用releaseSession(Session session)或者session.close来关闭session,无法实现自动管理session。所以很多人都倾向于用spring的Hibernatetemplate类或者HibernateDaoSupport的getHibernateTemplate方法来实现实现数据库的交互,当然,如果遇到hibernatetemplate无法实现的功能,可以使用

HibernateCallback的事务方法,如取分页的内容:可以参考这篇文章:

http://www.blogjava.net/beansoft/archive/2007/10/10/151702.html;;

         当然,有些人程序里一直用session,如果改hibernatetemplate的话,会涉及到很多的改动,那么通过spring加入事务, 例如 tx 标签或者 @Transactional 都可以.配置配置了 OpenSessionInViewFilter。可以在web.xml中添加:

  <filter>
     <filter-name>opensession</filter-name>
     <filter-class>
        org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
     </filter-class>
  </filter>
  <filter-mapping>
     <filter-name>opensession</filter-name>
     <url-pattern>*.do</url-pattern>
  </filter-mapping> 


   不过,在ejb中,如何控制session的关闭,这是我想知道的。

参考文摘:http://www.javaeye.com/topic/24556?page=3#140793   HibernateDaoSupport的session的释放

http://www.blogjava.net/beansoft/archive/2009/04/14/265504.html

Spring 的 HibernateDaoSupport 类的 getSession() 导致的连接泄露问题

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值