AAA getHibernateTemplate()和getSession()的区别

session对象通常有save(由瞬态到持久操作)、update(由托管到持久操作)、merge(区别在与它不会持久化给定的对象),如果不太清楚一律用updateorsava方法,下面的new表示一个映射数据表的一个javabean类






















AAA getHibernateTemplate()和getSession()的区别_第1张图片
假如使用getHibernateTemplate()插入一个数据,如果是getSession(),直接就是Session.save(obj)
	public Serializable save(T obj) {
		getHibernateTemplate().clear();
                Serializable serializable = getHibernateTemplate().save(obj);
		getHibernateTemplate().flush();  
		return serializable;
	}
DAO层有一个方法.内容是getHibernateTemplate().update(userInfo);有的时候可以更新,有的时候不能更新,需要flush().最完全的方法在其前面加上一个<pre name="code" class="java" style="font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 2; font-size: 14px; color: rgb(85, 85, 85);">getHibernateTemplate().clear()方法,确保万无一失。
 
   
</pre><pre name="code" class="java" style="font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 2;"><pre name="code" class="java" style="font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 2;"><strong><span style="font-size:24px;color:#ff0000;">如果自己写SQL可以调用公共类中的这个方法,注意参数只有一个hql就可以了 </span></strong>
 
   
public List<T> findByHQL(String hql) {
		if (StringUtils.isBlank(hql)) {//isBlank(hql)) {
			//getHibernateTemplate().loadAll(getEntityClass());
			throw new IllegalArgumentException("HQL语句不能为空!");
		}
		return getHibernateTemplate().find(hql);
	}
一个简单的粒子:
AAA getHibernateTemplate()和getSession()的区别_第2张图片

 
  
下面是关于批量操作的一些语句:
// 定义批量删除的HQL语句
		String hqlDelete = "delete User";
		// 执行删除
		int deletedEntities = session.createQuery( hqlDelete ).executeUpdate();
// 定义批量更新的HQL语句
		String hqlUpdate = "update User u set name = :newName";
		// 执行更新
		int updatedEntities = session.createQuery( hqlUpdate ).setString( "newName", "新名字" ).executeUpdate();
// <span style="font-family: 宋体, 'Arial Narrow', arial, serif;">定义批量插入的HQL语句</span>
循环100000次,插入100000条记录
		for (int i = 0 ; i < 100000 ; i++ )
		{
			// 创建User实例
			User u1 = new User();
			u1.setName("xxxxx" + i);
			u1.setAge(i);
			u1.setNationality("china");
			// 在Session级别缓存User实例
			session.save(u1);
			// 每当累加器是20的倍数时,将Session中数据刷入数据库,
			// 并清空Session缓存。
			if (i % 20 == 0)
			{
				session.flush();
				session.clear();
			}
		}
















1.使用getSession()方法你只要继承sessionFactory,而使用getHibernateTemplate()方法必须继承 HibernateDaoSupport当然包括sessionFactory,这点区别都不是特别重要的,下面这些区别就很重要了
2.getSession()方法是没有经过spring包装的,spring会把最原始的session给你,在使用完之后必须自己调用相应的 close方法,而且也不会对声明式事务进行相应的管理,一旦没有及时关闭连接,就会导致数据库连接池的连接数溢出,getHibernateTemplate()方法是经过spring封装的,例如添加相应的声明式事务管理,由spring管理相应的连接。
在实际的使用过程中发现的确getHibernateTemplate()比getSession()方法要好很多,但是有些方法在getHibernateTemplate()并没有提供,这时我们用HibernateCallback 回调的方法管理数据库.
HibernateTemplate的常用方法简介: 
q void delete(Object entity):删除指定持久化实例 
q deleteAll(Collection entities):删除集合内全部持久化类实例 
q find(String queryString):根据HQL查询字符串来返回实例集合 
q findByNamedQuery(String queryName):根据命名查询返回实例集合 
q get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例 
q save(Object entity):保存新的实例 
q saveOrUpdate(Object entity):根据实例状态,选择保存或者更新 
q update(Object entity):更新实例的状态,要求entity是持久状态 
q setMaxResults(int maxResults):设置分页的大小 
1.使用getSession()方法你只要继承 sessionFactory,而使用getHibernateTemplate()方法必须继承HibernateDaoSupport当然包括 sessionFactory,这点区别都不是特别重要的,下面这些区别就很重要了



例如如下代码:
/**
     * 使用 hql 语句进行操作
     * @param hql HSQL 查询语句(使用回调函数访问外部变量,必须是final的)
     * @param offset 开始取数据的下标
    * @param length 读取数据记录数
    * @return List 结果集
*/
public List getListForPage ( final String hql , final int offset , final int length ) {
              List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
                            public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
                                            Query query = session.createQuery ( hql ) ;
                                            query.setFirstResult ( offset ) ;
                                            query.setMaxResults ( length ) ;
                                            List list = query.list ( ) ;
                                            return list ;
               }
               }) ;
               return list ;
}
 

你可能感兴趣的:(AAA getHibernateTemplate()和getSession()的区别)