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

hibernate中的Interceptor

阅读更多

讲到Interceptor,相信熟悉struts2的童鞋肯定不会陌生了,struts2可以自定义拦截器进行自己想要的一系列相关的工作。而这里我们说的Interceptor也是差不多相似的功能。

废话不说,直接来代码:

下面这个是MyInterceptor类,它实现了Interceptor接口:

public String onPrepareStatement(String arg0) {
	return arg0;
}

public boolean onSave(Object arg0, Serializable arg1, Object[] arg2,
		String[] arg3, Type[] arg4) throws CallbackException {
	if (arg0 instanceof User) {
		System.out.println("User to be saved=>"+((User)arg0).getName());
	}
	return false;
}

  其他方法就不看了,按默认实现就行,我们只需要改这两个方法,需要把onPrepareStatement中的返回值改一下,改成返回当前的SQL语句,参数中就是传入的执行的SQL语句,我们直接返回就可以打印出该语句。

而在onSave中,看名字就可以知道是在保存的时候进行调用的。我们可以进行一系列保存前的工作。

相信大家看参数名称就可以看明白了吧。

Serializable是指序列号的参数,在这里是指跟数据库ID进行映射的属性

Object[]这是一系列的状态,暂时没怎么用到,以后用到再研究,但API中说明了,不管用何种方式修改了这个数组中的值,这个onSave方法必须返回true。

String[]是指属性的名称

而Type[]也就是相应属性的类型。

 

1)这个Interceptor可以在保存数据库前和后做一些相应的操作。比如想对数据进行修改,添加前缀或后缀的,都可以用它来实现,下面我们来看一下。

public boolean onSave(Object arg0, Serializable arg1, Object[] arg2,
		String[] arg3, Type[] arg4) throws CallbackException {
	if (arg0 instanceof User) {
		System.out.println("User to be saved=>"+((User)arg0).getName());
	}
	//我们在这里添加123作为名字的前缀
	User user = (User)arg0;
	user.setName("123"+user.getName());
	return false;
}

   我们看一下测试方法:

public static void main(String[] args) {

	Configuration cfg = new Configuration().configure();
	SessionFactory sessionFactory = cfg.buildSessionFactory();
	Interceptor interceptor = new MyInteceptor();
	Session session = sessionFactory.openSession(interceptor);
		
	User user = new User();
	user.setName("shun");
		
	Transaction tx = session.beginTransaction();
	session.save(user);
		
	tx.commit();
	session.close();
		
}

  很简单,我们只是进行了简单的保存而已。这里就没给出映射文件和实体类,大家随便弄个试一下就行。

运行它,我们可以看到:

User to be saved=>shun
Hibernate: insert into USER (USER_NAME, age) values (?, ?)
Hibernate: update USER set USER_NAME=?, age=? where USER_ID=?

  它会在最后进行更新姓名和年龄的操作,主要是因为我们在onSave方法中进行了修改。

  我们看到数据库中的值已经修改为有123前缀的了。

 

2)同样道理,我们可以在加载时修改属性的值:

public boolean onLoad(Object arg0, Serializable arg1, Object[] arg2,
		String[] arg3, Type[] arg4) throws CallbackException {
		
	if (arg0 instanceof User) {
		System.out.println("User to be loaded=>"+(arg2[0]+":"+arg2[1]));
	}
	User user = (User)arg0;
	//判断哪个属性是name
	for (int i = 0; i < arg3.length; i ++){
		if (arg3[i].equals("name")){
			user.setName(((String)arg2[i]).replace("123",""));
			arg2[i] = ((String)arg2[i]).replace("123","");
		}
	}
	return false;
}

  加载时修改属性的值是写在onLoad方法内。

这里的arg0就是我们的User对象,这里它还没有值,这个方法在load方法之后才进行调用,所以我们此时对user进行操作已经是于事无补了,而且我们这里的user.setName是没用的操作。主要在:

arg2[i] = ((String)arg2[i]).replace("123","");

   这句代码改变了返回的属性的值,那么我们在程序中拿到的user对象中的值也会改变,我们运行测试方法看看:

public static void main(String[] args) {

	Configuration cfg = new Configuration().configure();
	SessionFactory sessionFactory = cfg.buildSessionFactory();
	Interceptor interceptor = new MyInteceptor();
	Session session = sessionFactory.openSession(interceptor);
		
	User user = (User)session.load(User.class,new Long(39));
		
	System.out.println("User name:"+user.getName());
	session.close();
		
}

  看结果,我们得到了:

Hibernate: select user0_.USER_ID as USER1_0_0_, user0_.USER_NAME as USER2_0_0_, user0_.age as age0_0_ from USER user0_ where user0_.USER_ID=?
User to be loaded=>123shun:0
User name:shun

  我们已经把原来的123给去掉了,在真正加载后进行了相关的处理,不过这个并不是真正加载前的处理,有点投机的嫌疑。但也不失为一个考虑的方案。Interceptor也许用得最多的还是在日志的相关处理上,比如我们需要对每次操作都进行相应的日志记录,那么Interceptor是一个很好的选择。

  • 大小: 2.5 KB
1
0
分享到:
评论

相关推荐

    HibernateInterceptor.java

    Hibernate4,Interceptor,spring,quartz

    Hibernate与struts2结合使用的demo

    编写HibernateInterceptor,负责开启和关闭Session,以及处理异常。 ```java public class HibernateInterceptor implements Interceptor { public void destroy() {} public void init() {} public String ...

    Hibernate 3.2.0 中文官方文档

    14. **拦截器**:使用Interceptor接口,可以在对象持久化过程中添加自定义逻辑。 15. **CGLIB与JPA支持**:Hibernate 3.2.0 包括对CGLIB代理的支持,以及Java Persistence API(JPA)的部分实现。 通过深入学习...

    hibernate3.2_src官方源码

    7. **事件监听器和拦截器**:Hibernate允许在特定操作(如加载、保存、更新等)前后添加自定义逻辑,这在`org.hibernate.event`和`org.hibernate.interceptor`包中体现。 8. **实体生命周期**:源码中展示了...

    Hibernate3.2官方中文参考手册.pdf+Hibernate.pdf(Hibernate的学习资料)

    13. **拦截器(Interceptor)**:提供了一种在对象持久化过程中插入自定义代码的机制,比如在对象加载、保存或删除时执行特定的操作。 14. **增强型实体类(Enhanced Entity Classes)**:Hibernate 3.2引入了对...

    struts+hibernate整合jar包

    Struts和Hibernate是两个在Java Web开发中广泛使用的开源框架。Struts主要负责MVC(Model-View-Controller)架构的实现,提供控制层的功能,而Hibernate则是一个强大的对象关系映射(ORM)工具,用于简化数据库操作...

    Hibernate中文学习资料

    在Java世界中,Hibernate是一款非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作,让开发者可以使用面向对象的方式来处理数据。本篇将主要围绕`Hibernate3中文参考手册`展开,深入探讨Hibernate的基础...

    hibernate动态分表

    3. 操作拦截:可以使用Hibernate的事件监听机制,比如Interceptor,来在数据保存或查询前、后执行分表逻辑。 4. 分页查询:在动态分表环境中,传统的数据库分页可能不再适用,因为数据分布在多个表中。此时,需要...

    hibernate中文参考文档

    Hibernate允许用户注册事件监听器或实现Interceptor接口,对对象的生命周期事件进行拦截和自定义处理,例如在对象保存前进行合法性校验。 通过阅读和理解这份"hibernate中文参考文档",开发者可以全面了解Hibernate...

    struts2与hibernate整合单表增删改查(超完整)

    首先,需要在Struts2的配置文件中引入Hibernate的相关拦截器,如`hibernate-interceptor`,这样Action就可以访问到SessionFactory。然后,在Action中注入Session,通过Session进行CRUD操作。 **4. 用户注册** 用户...

    struts spring hibernate 中文api

    Struts、Spring 和 Hibernate 是Java开发中的三大框架,它们各自承担着不同的职责,共同构建了企业级应用的基础架构。这个压缩包提供了这三个框架的中文API文档,对于学习和使用这些框架的开发者来说,是非常宝贵的...

    hibernate源码

    Hibernate通过Interceptor和Event Listeners等机制监控对象状态的变化,自动处理对象的持久化操作,如Save、Update、Delete等。 四、查询语言HQL与Criteria API Hibernate提供两种高级查询语言:HQL(Hibernate ...

    Hibernate源码

    - **事件监听器**:探索EntityListener和Interceptor,它们可以在对象生命周期中的特定事件上执行自定义逻辑。 - **性能优化**:学习如何通过调整缓存策略、批处理、连接池配置等手段提高Hibernate的性能。 总之,...

    struts2+hibernate整合增删改查加注册登录Demo包含数据库自动建表语句

    1. **整合配置**:整合Struts2和Hibernate需要在Struts的配置文件中引入Hibernate的相关拦截器,如`hibernate-interceptor`,以便在Action执行时自动开启和关闭Session。 2. **实体类和映射文件**:为了使用...

    Hibernate之struts2整合hibernate以及MVC分层架构的使用案例hibernate002

    本案例主要关注的是如何将Hibernate ORM(对象关系映射)框架与Struts2 MVC(模型-视图-控制器)框架整合,同时探讨MVC分层架构在实际应用中的运用。以下是对这些知识点的详细说明: **1. Hibernate ORM框架** ...

    struts_hibernate整合

    在Java Web开发中,整合Struts2与Hibernate可以构建出高效、灵活且易于维护的业务应用。本教程将详细介绍如何进行这种整合。 首先,Struts2作为MVC框架,负责处理HTTP请求,控制应用程序的流程,以及处理视图的展示...

    hibernate v3.04中文参考手册

    - 实体类:代表数据库中的表,通过Java Bean属性对应表字段。 - 映射文件:定义实体类与数据库表的映射关系,包括主键、外键、字段类型等。 4. **Session与Transaction** - Session:作为数据库操作的主要接口,...

    hibernate4 全部jar包

    Hibernate 4 是一个流行的Java持久化框架,用于简化数据库交互,尤其在企业级应用程序中广泛使用。SSH(Struts、Spring、Hibernate)是Java Web开发中的经典三层架构,其中Hibernate负责对象关系映射(ORM)。这个...

Global site tag (gtag.js) - Google Analytics