Hibernate 的复杂用法HibernateCallback在什么样的情况下可以使用

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/03 13:36:55
Hibernate 的复杂用法HibernateCallback在什么样的情况下可以使用

Hibernate 的复杂用法HibernateCallback在什么样的情况下可以使用
Hibernate 的复杂用法HibernateCallback在什么样的情况下可以使用

Hibernate 的复杂用法HibernateCallback在什么样的情况下可以使用
HibernateTemplate还提供了一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式.HibernateTemplate的灵活访问方式可通过如下两个方法完成:
● Object execute(HibernateCallback action).
● List execute(HibernateCallback action).
这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用.程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装 Hibernate后灵活性不足的缺陷.
HibernateCallback 是一个接口,该接口包含一个方法doInHibernate(org.hibernate. Session session),该方法只有一个参数Session.在开发中提供HibernateCallback实现类时,必须实现接口里包含的 doInHibernate方法,在该方法体内即可获得Hibernate Session的引用,一旦获得了Hibernate Session的引用,就可以完全以Hibernate的方式进行数据库访问.
注意:doInHibernate方法内可以访问Session,该Session对象是绑定在该线程的Session实例.该方法内的持久层操作,与不使用Spring时的持久层操作完全相同.这保证了对于复杂的持久层访问,依然可以使用Hibernate的访问方式.
下面的代码对HibernateDaoSupport类进行扩展(虽然Spring 2.0的HibernateTemplate提供了一个分页方法setMaxResults,但仅此一个方法依然不能实现分页查询),这种扩展主要是为该类增加了3个分页查询的方法,分页查询时必须直接调用Hibernate的Session完成,因此,必须借助于HibernateCallBack的帮助.
public class YeekuHibernateDaoSupport extends HibernateDaoSupport
{
/**
* 使用hql 语句进行分页查询操作
* @param hql 需要查询的hql语句
* @param offset 第一条记录索引
* @param pageSize 每页需要显示的记录数
* @return 当前页的所有记录
*/
public List findByPage(final String hql,
final int offset, final int pageSize)
{
//HibernateDaoSupport已经包含了getHibernateTemplate()方法
List list = getHibernateTemplate().executeFind(new
HibernateCallback()
{
public Object doInHibernate(Session session)
throws HibernateException, SQLException
//该方法体内以Hibernate方法进行持久层访问
{
List result = session.createQuery(hql)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
/**
* 使用hql 语句进行分页查询操作
* @param hql 需要查询的hql语句
* @param value 如果hql有一个参数需要传入,value就是传入的参数
* @param offset 第一条记录索引
* @param pageSize 每页需要显示的记录数
* @return 当前页的所有记录
*/
public List findByPage(final String hql , final Object value ,
final int offset, final int pageSize)
{
List list = getHibernateTemplate().executeFind(new
HibernateCallback()
{
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//下面查询的是最简单的Hiberante HQL查询
List result = session.createQuery(hql)
.setParameter(0, value)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
/**
* 使用hql 语句进行分页查询操作
* @param hql 需要查询的hql语句
* @param values 如果hql有多个参数需要传入,values就是传入的参数数组
* @param offset 第一条记录索引
* @param pageSize 每页需要显示的记录数
* @return 当前页的所有记录
*/
public List findByPage(final String hql, final Object[] values,
final int offset, final int pageSize)
{
List list = getHibernateTemplate().executeFind(new
HibernateCallback()
{
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
Query query = session.createQuery(hql);
for (int i = 0 ; i < values.length ; i++)
{
query.setParameter( i, values[i]);
}
List result = query.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
}
在上面的代码实现中,直接使用了getHibernateTemplate()方法,这个方法由Hibernate- DaoSupport提供.而YeekuHibernateDaoSupport是HibernateDaoSupport的子类,因此,可以直接使用该方法.
当实现doInHibernate(Session session)方法时,完全以Hibernate的方式进行数据库访问,这样保证了Hibernate进行数据库访问的灵活性.
注意:Spring提供的XxxTemplate和XxxCallBack互为补充,二者体现了Spring框架设计的用心良苦:XxxTemplate对通用操作进行封装,而XxxCallBack解决了封装后灵活性不足的缺陷.

Hibernate 的复杂用法HibernateCallback在什么样的情况下可以使用 hibernate.properties和hibernate.cfg.xml的区别 hibernate.cfg.xml和hibernate.properties的区别 struts2+spring +Hibernate的思想 hibernate.cfg.xml是什么东西?有什么用?hibernate.xml呢?与hibernate.xml的区别是什么? hibernate怎么记住他的意思 J2EE框架(Struts&Hibernate&Spring)的理解 hibernate的fetch=join的用法如果fetch=join,那么hql语句里是不是也要写上outer join关联语句 数学推出符号的用法基本用法以及一些复杂用法.(有例子) 如达要求, 标点符号的基本用法,简单一些的,不用太复杂. 英语中'to do'的用法不用太复杂, Hibernate的抓取策略?有那两种定义方式? 关于 hibernate reverse engineering为什么我点 hibernate reverse engineering 没有反应?我要生成 hbm.xml 文件 我的操作步骤是 生成 hibernate configuration file 后,然后在数据库中点hibernate reverse engineering.第一次 hibernate中Configuration configuration=new Configuration().configure();默认读取的是hibernate.cfg.xml文件,怎么让它去读取applicationContext.xml,SH结合使用 常用的及物和不及物动词有哪些还有说明一下复杂动命词的用法 complex和complicated都有复杂的意思,它们的用法区别在哪?如题 八年级上册英语M1到M6单词的用法,要用法!不用太复杂,一个用法就行,急用!赏100,追50! 三大框架集合时,hibernate的事务提交的作用及写法.