Interceptor接口提供了从会话(session)回调(callback)应用程序(application)的机制, 这种回调机制可以允许应用程序在持久化对象被保存、更新、删除或是加载之前,检查并(或)修改其 属性。一个可能的用途,就是用来跟踪审核(auditing)信息。

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方法。

例:

<script src="/images/code/js/shCore.js" type="text/javascript"></script> <script></script> <script src="/images/code/js/shBrushJava.js" type="text/javascript"></script>

view plain copy to clipboard print ?
  1. public class MyHibernateInterceptor extends EmptyInterceptor {
  2. public boolean onFlushDirty(Object entity, Serializable id,
  3. Object[] currentState, Object[] previousState,
  4. String[] propertyNames, Type[] types) throws CallbackException {
  5. try {
  6. Date updtime = new Date();
  7. for (int i = 0; i < propertyNames.length; i++) {
  8. if ("updateDatetime".equals(propertyNames[i])) {
  9. state[i] = updtime;
  10. }
  11. }
  12. } catch (Exception ex) {
  13. return false;
  14. }
  15. return true;
  16. }
  17. public boolean onSave(Object entity, Serializable id, Object[] state,
  18. String[] propertyNames, Type[] types) throws CallbackException {
  19. try {
  20. Date updtime = new Date();
  21. for (int i = 0; i < propertyNames.length; i++) {
  22. if ("updateDatetime".equals(propertyNames[i])
  23. || "createDatetime".equals(propertyNames[i])) {
  24. state[i] = updtime;
  25. }
  26. }
  27. } catch (Exception ex) {
  28. return false;
  29. }
  30. return true;
  31. }
  32. }
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个字段是否被正确地设置了日期。

利用Hibernate Interceptor回调机制 统一设置数据表的共通属性相关推荐

  1. Android开发之通过接口回调机制加载数据(源代码分享)

    Android开发之通过接口回调机制加载数据的简单实现,在实际开发中通过callback方法得到网络加载的数据的使用频率远比通过直接开启线程或异步任务加载数据的频率高的多,这篇文章的代码将简单实现该机 ...

  2. access在哪里可以设主键_access利用DAO设置数据表的主键

    access数据表中,建议都设置一下主键.既可以保证实体的完整性,也加快数据库的操作速度. 在access中,添加主键可以用点击表格右键,主键,看到的钥匙符号就是主键了. 也可以通过代码动态添加主键 ...

  3. navicat设置数据表的外键

    所谓的外键其实就是指针 例如,t_user有个外键,意思就是t_user中的外键其实指向了外面一个表中的一个字段 t _user设定了外键以后,对于外键school_id的赋值时额取值范围,必须是在t ...

  4. 利用ArcGIS创建要素与表之间的关系类并发布带有关系数据表的要素服务

    在GIS实际应用中,可能会遇到这样的问题,比如现有一个面要素表示宗地,它有一个或者多个业务属性表包含了宗地的属性信息,如果将这些信息逐个添加到一个面要素的属性中分别作为要素的字段,当字段特别多时这种方 ...

  5. Mysql数据库和数据表的创建和信息更改的常用指令

    文章目录 数据库和数据表的创建和信息更改 后续小实验做准备 一. 关于数据库和数据表的其它操作 1)数据库 ①创建数据库 ②显示目前所有的数据库 ③数据库重命名 2.1 先创建新库: 2.2 使用`R ...

  6. SQL Sever 创建与管理数据表

    目录 一.创建数据表 1.使用SQL Sever Management Studio创建数据表 2.使用CREATE TABLE语句创建数据库 二.管理数据表 1.查看表结构 1.1查看数据表的属性 ...

  7. A.CTable开源框架Mybatis增强自动创建表/更新表结构/实现类似hibernate共通的增删改查-mybatis-enhance-actable

    mybatis-enhance-actable-1.3.1.RELEASE 项目已更新既支持传统Spring项目也支持Springboot项目,同时支持tk.mybatis能够支持更强大的CUDR(为 ...

  8. php清空mysql数据表,mysql怎么清空数据表数据

    在mysql中,可以利用"DELETE"和"TRUNCATE"关键字来清空数据表中的数据,具体语法为"DELETE FROM 数据表;"和& ...

  9. ecshop数据表结构说明

    http://www.ecshop119.com/ecshopjc-853.html ecs_account_log 用户帐号情况记录表,包括资金和积分等 log_id mediumint 自增ID号 ...

最新文章

  1. 基于Python的HTTPS协议模拟登陆+爬取页面
  2. 2021-03-21 jdk中体统的URL能访问的协议非常有限(当然可以进行扩展,不过很麻烦),常用的有http,file,ftp等等
  3. Python之路(第九篇)Python文件操作
  4. 【Interfacenavigation】风格和主题(21)
  5. JoshChen_php 简单的商城网站功能原理(一)
  6. 如何去使用Python爬虫来爬取B站的弹幕数据?
  7. S5 Linux信息显示与搜索文件命令
  8. 思考设计模式在自助终端软件上的应用 ——Observer(观察着)模式
  9. (1.2)HarmonyOS鸿蒙config.json
  10. 优化理论03----优化导论和无约束问题的最优条件、优化问题的类型、局部、全局和严格优化、梯度和Hessian 黑塞矩阵和方向导数、无约束问题的最优条件
  11. Oracle 客户端安装 + pl/sql工具安装配置
  12. WinForm------GridControl添加底部合计框
  13. 诺基亚7 android 9,诺基亚7 Plus正式推送安卓9.0系统!
  14. 隋朝之前,扬州指的是现在的南京
  15. 信息学竞赛中的直觉与证明 - 刘汝佳
  16. RTF 文件格式解析
  17. 做笔记的方法—— 推荐笔记方法Word方式
  18. 穷人的语义处理工具箱之二:语义编辑距离
  19. 再说“恢复被删除的文件”(转)
  20. 提高团队成员的工作积极性/团队凝聚力

热门文章

  1. 老兵不死,只是凋零:前九枝兰架构师王晓辉
  2. 计算机视觉——python在一张图中画多条ROC线
  3. java calendar获取日期_Java使用Calendar获取当前日期
  4. ROS的安装教程(noetic版本)
  5. 一个优秀的管理者,一看专业能力,二看管理技巧,三看……
  6. java诗句_java--补全诗句代码
  7. 商务人士绝佳伴侣 电信与酷派合推双系统安全旗舰机
  8. Mutex和RWMutex
  9. oracledatabase11gr2怎么打开_Oracle Database 11gR2性能调整与优化 PDF 下载
  10. mac桌面版安装docker并安装centos环境