- 浏览: 91685 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
yangmeng_3331:
该用户名已存在 写道如果是字符串,是按照 parse 方法中的 ...
javascript时间戳与日期转换 -
该用户名已存在:
如果是字符串,是按照 parse 方法中的规则进行解析。var ...
javascript时间戳与日期转换 -
yangmeng_3331:
shiyiyue513 写道文中有诸多不妥之处。我是初学者,一 ...
Java中的栈,堆和常量池 -
shiyiyue513:
文中有诸多不妥之处。
Java中的栈,堆和常量池
[转]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的匿名内部类来获取 HibernateCallback的实例,方法 doInHibernate的方法体就是 Spring执行的持久化操作。具体代码如下:
注意:方法 doInHibernate方法内可以访问 Session,该 Session对象是绑定到该线程的 Session实例。该方法内的持久层操作,与不使用 Spring时的持久层操作完全相同。这保证对于复杂的持久层访问,依然可以使用 Hibernate的访问方式。
同样的,this.getSession() 也能执行灵活的sql,hql,那么为什么要用 HibernateCallback().?
1.this.getSession() 是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,它可以从当前事务或者一个新的事务获得一个hibernate session,需要程序维护session(手动关闭session)
2.this.getHibernateTemplate().getSessionFactory().getCurrentSession()/openSession()则从spring中获取session
getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。
采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭
3.通过new HibernateCallback(){XXX}获得的session是当前线程中的session
4.hibernateTemplate会确保当前hibernate的session对象的正确打开和关闭,并直接参与到事物管理中去,template实例不仅是线程安全的同时也是可重用的
5.不提倡用getSession()来获得session实现,因为这样拿到的session是hibernate最原始的session不享有spring提供的模板支持需要手动的关闭session,可以使用new HibernateCallback(){xxx}得到session
Object execute(HibernateCallback action)
List execute(HibernateCallback action)
这两个方法都需要一个 HibernateCallback的实例, HibernateCallback实例可在任何有效的 Hibernate数据访问中使用。程序开发者通过 HibernateCallback,可以完全使用 Hibernate灵活的方式来访问数据库,解决 Spring封装 Hibernate后灵活性不足的缺陷。 HibernateCallback是一个接口,该接口只有一个方法 doInHibernate(org.hibernate.Session session),该方法只有一个参数 Session。
通常,程序中采用实现 HibernateCallback的匿名内部类来获取 HibernateCallback的实例,方法 doInHibernate的方法体就是 Spring执行的持久化操作。具体代码如下:
public class PersonDaoImpl implements PersonDao{ //私有实例变量保存 SessionFactory private SessionFactory sessionFactory; //依赖注入必须的 setter方法 public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } /** * 通过人名查找所有匹配该名的 Person实例 * @param name 匹配的人名 * @return 匹配该任命的全部 Person集合 */ public List findPersonsByName(final String name) { //创建 HibernateTemplate实例 HibernateTemplate hibernateTemplate = new HibernateTemplate(this.sessionFactory); //返回 HibernateTemplate的 execute的结果 return (List) hibernateTemplate.execute( //创建匿名内部类 new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { //使用条件查询的方法返回 List result = session.createCriteria(Person.class) .add(Restrictions.like(“name”, name+”%”) .list(); return result; } }); } }
注意:方法 doInHibernate方法内可以访问 Session,该 Session对象是绑定到该线程的 Session实例。该方法内的持久层操作,与不使用 Spring时的持久层操作完全相同。这保证对于复杂的持久层访问,依然可以使用 Hibernate的访问方式。
/** 条件更新数据 */ public int update(String hql) { final String hql1 = hql; return ((Integer)getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException{ Query query = session.createQuery(hql1); return query.executeUpdate(); } })).intValue(); }
同样的,this.getSession() 也能执行灵活的sql,hql,那么为什么要用 HibernateCallback().?
1.this.getSession() 是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,它可以从当前事务或者一个新的事务获得一个hibernate session,需要程序维护session(手动关闭session)
2.this.getHibernateTemplate().getSessionFactory().getCurrentSession()/openSession()则从spring中获取session
getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。
采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭
3.通过new HibernateCallback(){XXX}获得的session是当前线程中的session
4.hibernateTemplate会确保当前hibernate的session对象的正确打开和关闭,并直接参与到事物管理中去,template实例不仅是线程安全的同时也是可重用的
5.不提倡用getSession()来获得session实现,因为这样拿到的session是hibernate最原始的session不享有spring提供的模板支持需要手动的关闭session,可以使用new HibernateCallback(){xxx}得到session
发表评论
-
使用Apache commons-net.jar开发FTP工具类
2014-06-10 15:33 1542最开始使用jdk自带的rt.jar开发FTP工具类,后 ... -
使用Axis2搭建web Service
2014-06-06 09:59 12831、首先下载需要的一些相关axis2.zip及jar包 ... -
使用Axis1搭建web Service
2014-06-05 12:25 642首先创建一个demo,然后建一个AxisService ... -
Hibernate操作Oracle中clob、blob总结
2013-11-01 11:36 6959一、区别与定义 LONG: 可变长的字符串数据,最长2G,LO ... -
Hibernate不同数据库的链接及方言
2013-10-29 13:23 576<!--MySql 驱动程序 eg. mysql ... -
springMVC使用JNDI连接数据库
2013-10-21 13:55 1197service.xml dataSource <b ... -
org.apache.commons.beanutils.PropertyUtils使用
2013-08-06 10:51 1457org.apache.commons.beanutils.Pr ... -
使用apache的ant.jar进行压缩/解压缩文件
2013-06-28 11:43 2056windows系统默认字符集为 ... -
json-lib使用JSONObject与JSONArray
2013-06-08 16:54 8631.从Object到String 要先用Object对象构造 ... -
java字符串与unicode转换
2013-06-07 13:27 715/** * 字符串转化为unicod ... -
给定一个接口返回这个接口所有实现类
2013-02-28 09:15 1833package com.dobn.bdgcgl.test; ... -
单例模式
2013-02-27 16:39 755概念:确保一个类只有一个实例,并提供一个全局访问点来获取该实例 ... -
利用java反射实现两个具有相同属性bean赋值
2012-11-22 16:19 2291package com.dobn.bdgcgl.utils ... -
JPA 实体关系注解
2012-10-15 15:44 15361.单向一对一 @OneToMany( ... -
Spring注解入门
2012-08-09 10:37 941转自http://casheen.iteye.com/ ... -
向Oracle中插入BLOB类型
2012-06-18 03:08 1374使用s2sh框架。实体类: ... -
从Oracle中读取blob类型存储的图片
2012-06-13 17:28 2655最近做个项目使用S2SH和Oracle数据库,其中ph ... -
Hibernate中cascade与inverse
2012-06-03 09:21 836cascade: 当Hibernate ... -
SSH配置事务
2012-06-02 18:30 934web.xml中配置 <filter> ... -
SSH中使用spring解决中文乱码问题
2012-05-30 00:00 805在web.xml中添加配置,Spring提供了专门的针对Enc ...
相关推荐
在上面的代码中,我们使用 `HibernateCallback` 接口来执行原生 SQL 语句,该接口提供了一个 `doInHibernate()` 方法,该方法将在 Hibernate 事务中执行。我们可以在该方法中执行原生 SQL 语句,并使用 `Connection`...
开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决了Spring封装Hibernate后灵活性不足的缺陷。 24.3 Spring对Hibernate的简化 24.3.4 HibernateTemplate的复杂用法 ...
总的来说,HibernateTemplate提供了一组强大的方法来简化Hibernate的日常操作,涵盖了从简单的数据存取到复杂的数据库操作,极大地提升了开发效率。在实际应用中,根据数据量、性能需求以及业务逻辑,选择合适的方法...
这个类将复杂的Hibernate API隐藏在后面,使得开发者可以更专注于业务逻辑,而不是数据库操作的细节。 **二、主要功能** 1. **事务管理**:HibernateTemplate自动管理Hibernate Session和Transaction,确保在事务...
本文详细介绍了Spring与Hibernate集成的过程,包括如何配置`SessionFactory`、使用`HibernateTemplate`简化数据操作、通过`HibernateDaoSupport`提高代码可维护性以及利用`HibernateCallback`实现更复杂的业务逻辑。...
【Hibernate学习笔记,使用Hibernate做数据层非常方便】 在Java开发中,Hibernate是一个非常流行的ORM(Object-Relational Mapping)框架,它简化了数据库操作,将数据库中的表映射为Java对象,使得开发者可以像...
`queryForPage` 方法通过`getHibernateTemplate().executeFind()`方法执行HQL查询,并利用`HibernateCallback`接口回调来设置查询的起始位置和最大结果数,从而实现分页。`getAllRowCount` 方法则直接返回HQL查询后...
此外,`HibernateTemplate`还支持`HibernateCallback`接口,允许开发者在回调方法`doInHibernate(Session session)`中使用原生的Hibernate API,以应对更复杂的数据访问需求。这种方法确保了灵活性,即使在Spring的...
例如,你可以通过实现HibernateCallback接口的doInHibernate方法,传入一个回调函数,执行特定的Hibernate操作。此外,HibernateTemplate会自动处理HibernateException,并将其转化为Spring的DataAccessException,...
虽然`HibernateTemplate`提供了很多便利,但它在处理复杂查询时可能需要创建内部类(inner class),如在分页查询时使用`execute(HibernateCallBack)`,这可能会增加调试的复杂性。相比之下,直接使用`Session`进行...
HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的数据操作方法,如execute(HibernateCallback action),load(Class entityClass, Serializable id),save(final ...
**二、Hibernate的复杂用法** 1. **HibernateCallback** HibernateTemplate支持`HibernateCallback`接口,允许在回调方法中执行自定义的Hibernate操作。这提供了一种方式在事务内部执行复杂操作,例如批量处理或...
5. **回调机制**:当`getHibernateTemplate()`的标准方法无法满足特定需求时,可以使用`HibernateCallback`接口进行自定义操作。这允许你在Hibernate的Session内部执行任意操作,同时仍然享受到Spring提供的事务和...
3. **使用HibernateCallback**: HibernateCallback是一个接口,可以在Session中执行回调方法,例如查询数据。 ```java HibernateCallback<List<Dept>> callback = new HibernateCallback<List<Dept>>() { @...
- 接口注入:已逐渐淘汰,不推荐使用,因为它需要实现特定的接口,增加了复杂性。 6. bean中的scope属性: scope属性定义了bean的作用域,常见的有singleton(单例)、prototype(多例)等。单例模式下,Spring容器...
另一种格式(第10-16行)展示了如何在一个匿名内部类中使用`HibernateCallback`接口执行删除操作,这种方式在处理更复杂的逻辑时更为灵活。 3. **HQL单表查询**: HQL可以轻松地执行针对单个表的查询。第19行的HQL...
`HibernateCallback`的`doInHibernate`方法会在Hibernate的Session上下文中执行,使得开发者可以直接操作Session。 描述中的示例代码展示了如何使用`HibernateTemplate`执行事务操作。在这个例子中,开发者试图保存...
### HibernateTemplate 分组统计知识点详解 #### 一、概述 在Java Web开发中,尤其是在使用...这不仅有助于更好地理解和掌握Spring与Hibernate的集成方式,同时也为解决实际项目中的复杂数据处理问题提供了有效途径。
如示例所示,通过`getHibernateTemplate().execute()`方法传递一个`HibernateCallback`,然后在回调方法中创建并执行`CallableStatement`。这使得在Java应用程序中直接调用数据库的存储过程成为可能,提高性能并简化...
在实际开发中,开发者可以根据需求构建更复杂的查询,包括使用JOIN、GROUP BY、HAVING等子句,以及使用更复杂的查询构造。同时,需要注意的是,HQL执行时需要考虑事务管理,以确保数据的一致性和完整性。