Hibernate给我们提供了非常灵活的机制,可以让我们非常容易地做一些共通处理,比如所有表都有同样的字段,可以用同样的方法设值。这时我们没必要在业务处理中每个地方都写上同样的代码。
例如:我们几乎所有的表中都有2个字段:UPDATE_DATETIME和CREATE_DATETIME。分别对应属性名为:updateDatetime和createDatetime。我们需要在修改数据时自动设置updateDatetime,插入数据时自动设置updateDatetime,createDatetime。
我们可以利用Hibernate提供给我们的Interceptor机制实现这个目标。
实现方法:
首先写一个类继承org.hibernate.EmptyInterceptor或者实现org.hibernate.Interceptor接口:
为了简单起见,一般直接继承org.hibernate.EmptyInterceptor就可以了。
然后重载一下onFlushDirty方法和onSave方法就可以了。
因为Hibernate会在更新数据时回调onFlushDirty方法,在插入数据时回调onSave方法。
例:
public class MyHibernateInterceptor extends EmptyInterceptor {
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) throws CallbackException {
try {
Date updtime = new Date();
for (int i = 0; i < propertyNames.length; i++) {
if ("updateDatetime".equals(propertyNames[i])) {
state[i] = updtime;
}
}
} catch (Exception ex) {
return false;
}
return true;
}
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) throws CallbackException {
try {
Date updtime = new Date();
for (int i = 0; i < propertyNames.length; i++) {
if ("updateDatetime".equals(propertyNames[i])
|| "createDatetime".equals(propertyNames[i])) {
state[i] = updtime;
}
}
} catch (Exception ex) {
return false;
}
return true;
}
}
public class MyHibernateInterceptor extends EmptyInterceptor {
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) throws CallbackException {
try {
Date updtime = new Date();
for (int i = 0; i < propertyNames.length; i++) {
if ("updateDatetime".equals(propertyNames[i])) {
state[i] = updtime;
}
}
} catch (Exception ex) {
return false;
}
return true;
}
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) throws CallbackException {
try {
Date updtime = new Date();
for (int i = 0; i < propertyNames.length; i++) {
if ("updateDatetime".equals(propertyNames[i])
|| "createDatetime".equals(propertyNames[i])) {
state[i] = updtime;
}
}
} catch (Exception ex) {
return false;
}
return true;
}
}
为了使Hibernate能回调我们的方法,需要在open session时设置:
Session session = SessionFactory.openSession(new MyHibernateInterceptor());
测试代码这里就不介绍了。可以自己写个数据插入/修改的TestCase,看看数据库那2个字段是否被正确地设置了日期。
分享到:
相关推荐
14. **事件监听器**:允许开发者自定义事件处理,如对象保存、更新、删除前后的回调函数。 15. **拦截器(Interceptor)**:类似于事件监听器,但能更深入地干预对象的生命周期,可以在对象的创建、加载、保存、...
Hibernate API 是一个功能强大的 Java 持久层框架,提供了大量的接口类型来访问数据库、配置 Hibernate、回调事件、映射类型和扩展接口功能等。下面将详细介绍 Hibernate API 的接口类型。 核心接口 1. org....
3. **回调接口** - **Interceptor**:此接口允许开发者监听Hibernate内部发生的事件,如对象加载、删除、保存和更新,从而实现定制的行为,如记录数据更改日志。 4. **映射接口** - **Type**接口:定义了...
在本章中,我们将深入探讨Hibernate的高级特性,特别是关于对象的持久化实现和回调与拦截机制。首先,让我们详细解析Hibernate的实体对象生命周期。 在Hibernate中,实体对象经历了三种不同的状态,它们分别是: 1...
#### Hibernate回调与拦截机制 Hibernate提供了一套强大的事件监听系统,允许开发者在特定时刻执行自定义逻辑。这包括但不限于实体的创建、更新、删除等生命周期事件。 - **Lifecycle与Validatable接口**:`...
回调接口 1. org.hibernate.Interceptor Interface:不必由持久化类来实现,可以自定义实现该接口的类,也是响应持久化实例被加载、删除、保存、更新等事件。可以通过该接口实现数据更改日志。 映射接口 1. Type ...
- 回调和拦截器(Callback and Interceptor):Hibernate允许开发者定义回调方法和拦截器来增强对实体生命周期事件的控制。 Hibernate 3.2作为一个成熟的ORM框架,在企业级应用开发中占据着重要的地位。它不仅降低...
回调接口是 Hibernate 的一个重要组件,当一个对象发生了特定的事件,例如对象被加载、保存、更新或删除,Hibernate 应用可以通过回调接口来响应这一事件。回调接口按实现方式可分为两类:Lifecycle 和 Validatable ...
Hibernate API ...回调接口 使应用程序能够监听 Hibernate 内部发生的各种事件,并做出相应的回应。 包括 Interceptor 接口。
这涉及到与第三方API的交互,可能需要处理异步回调和支付状态同步。 6. 安全模块:确保系统安全,如防止SQL注入、XSS攻击,可能使用Struts2的拦截器进行安全控制。 7. 权限管理模块:根据角色分配不同的操作权限,...
Struts2可以通过自定义Interceptor处理这些业务逻辑,如检查库存、处理支付回调等。 5. 数据库操作:系统可能使用了ORM框架如Hibernate或MyBatis,与数据库进行交互,Struts2可以通过插件与这些框架集成,简化数据...
此外,JavaScript的异步编程模型,如回调函数、Promise和Async/Await,以及前端框架如React、Vue或Angular的相关知识也是常见的面试话题。 这些面试题涵盖了从后端到前端,从基础概念到实际应用的广泛内容。通过...
这需要处理支付状态的回调,确保交易的顺利完成。 总的来说,这个项目涵盖了Java Web开发的多个关键点,包括前端交互、后端业务逻辑、数据库设计和整合第三方服务等,对于提升Java开发者在实际项目中的应用能力具有...
虽然这个项目没有实现支付功能,但在实际环境中,支付环节是非常关键的,通常会涉及到第三方支付平台如支付宝或微信支付的接口集成,需要处理支付状态的回调和异常情况。 总结起来,SSH框架构建的购物网站是一个...
1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求后各调一次。 4、拦截...