讲到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
分享到:
相关推荐
Hibernate4,Interceptor,spring,quartz
编写HibernateInterceptor,负责开启和关闭Session,以及处理异常。 ```java public class HibernateInterceptor implements Interceptor { public void destroy() {} public void init() {} public String ...
14. **拦截器**:使用Interceptor接口,可以在对象持久化过程中添加自定义逻辑。 15. **CGLIB与JPA支持**:Hibernate 3.2.0 包括对CGLIB代理的支持,以及Java Persistence API(JPA)的部分实现。 通过深入学习...
7. **事件监听器和拦截器**:Hibernate允许在特定操作(如加载、保存、更新等)前后添加自定义逻辑,这在`org.hibernate.event`和`org.hibernate.interceptor`包中体现。 8. **实体生命周期**:源码中展示了...
13. **拦截器(Interceptor)**:提供了一种在对象持久化过程中插入自定义代码的机制,比如在对象加载、保存或删除时执行特定的操作。 14. **增强型实体类(Enhanced Entity Classes)**:Hibernate 3.2引入了对...
Struts和Hibernate是两个在Java Web开发中广泛使用的开源框架。Struts主要负责MVC(Model-View-Controller)架构的实现,提供控制层的功能,而Hibernate则是一个强大的对象关系映射(ORM)工具,用于简化数据库操作...
在Java世界中,Hibernate是一款非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作,让开发者可以使用面向对象的方式来处理数据。本篇将主要围绕`Hibernate3中文参考手册`展开,深入探讨Hibernate的基础...
3. 操作拦截:可以使用Hibernate的事件监听机制,比如Interceptor,来在数据保存或查询前、后执行分表逻辑。 4. 分页查询:在动态分表环境中,传统的数据库分页可能不再适用,因为数据分布在多个表中。此时,需要...
Hibernate允许用户注册事件监听器或实现Interceptor接口,对对象的生命周期事件进行拦截和自定义处理,例如在对象保存前进行合法性校验。 通过阅读和理解这份"hibernate中文参考文档",开发者可以全面了解Hibernate...
首先,需要在Struts2的配置文件中引入Hibernate的相关拦截器,如`hibernate-interceptor`,这样Action就可以访问到SessionFactory。然后,在Action中注入Session,通过Session进行CRUD操作。 **4. 用户注册** 用户...
Struts、Spring 和 Hibernate 是Java开发中的三大框架,它们各自承担着不同的职责,共同构建了企业级应用的基础架构。这个压缩包提供了这三个框架的中文API文档,对于学习和使用这些框架的开发者来说,是非常宝贵的...
Hibernate通过Interceptor和Event Listeners等机制监控对象状态的变化,自动处理对象的持久化操作,如Save、Update、Delete等。 四、查询语言HQL与Criteria API Hibernate提供两种高级查询语言:HQL(Hibernate ...
- **事件监听器**:探索EntityListener和Interceptor,它们可以在对象生命周期中的特定事件上执行自定义逻辑。 - **性能优化**:学习如何通过调整缓存策略、批处理、连接池配置等手段提高Hibernate的性能。 总之,...
1. **整合配置**:整合Struts2和Hibernate需要在Struts的配置文件中引入Hibernate的相关拦截器,如`hibernate-interceptor`,以便在Action执行时自动开启和关闭Session。 2. **实体类和映射文件**:为了使用...
本案例主要关注的是如何将Hibernate ORM(对象关系映射)框架与Struts2 MVC(模型-视图-控制器)框架整合,同时探讨MVC分层架构在实际应用中的运用。以下是对这些知识点的详细说明: **1. Hibernate ORM框架** ...
在Java Web开发中,整合Struts2与Hibernate可以构建出高效、灵活且易于维护的业务应用。本教程将详细介绍如何进行这种整合。 首先,Struts2作为MVC框架,负责处理HTTP请求,控制应用程序的流程,以及处理视图的展示...
- 实体类:代表数据库中的表,通过Java Bean属性对应表字段。 - 映射文件:定义实体类与数据库表的映射关系,包括主键、外键、字段类型等。 4. **Session与Transaction** - Session:作为数据库操作的主要接口,...
Hibernate 4 是一个流行的Java持久化框架,用于简化数据库交互,尤其在企业级应用程序中广泛使用。SSH(Struts、Spring、Hibernate)是Java Web开发中的经典三层架构,其中Hibernate负责对象关系映射(ORM)。这个...