对于日志和事件的记录在每个项目中都会用到,如果在每个manager层中触发时间记录的话,会比较难以扩展和维护,所以可配置的日志和事件记录在项目中会用到!

首先在spring的配置文件中加入hibernate拦截器

Java代码
  1. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  2. <property name="entityInterceptor">
  3. <ref bean="myInterceptor"/>
  4. </property>
  5. </bean>
  6. <bean id="myInterceptor" class="com.creawor.cbsms.util.MyInterceptor" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="entityInterceptor"> <ref bean="myInterceptor"/> </property> </bean> <bean id="myInterceptor" class="com.creawor.cbsms.util.MyInterceptor" />

MyInterceptor拦截器为:

Java代码
  1. package com.creawor.cbsms.util;
  2. import java.io.Serializable;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.util.Iterator;
  6. import javacommon.util.ApplicationContextHolder;
  7. import org.hibernate.CallbackException;
  8. import org.hibernate.EntityMode;
  9. import org.hibernate.Interceptor;
  10. import org.hibernate.Transaction;
  11. import org.hibernate.type.Type;
  12. import com.creawor.cbsms.event.EventRecord;
  13. import com.creawor.cbsms.model.CbsChannel;
  14. import com.creawor.cbsms.model.CbsMessage;
  15. public class MyInterceptor implements Interceptor{
  16. //删除时记录时间
  17. public void onDelete(Object obj, Serializable arg1, Object[] arg2, String[] arg3, Type[] arg4) throws CallbackException {
  18. // TODO Auto-generated method stub
  19. String[] entitys = EventRecord.getDeleteEntitysFireEvent();
  20. for (String entityName : entitys) {
  21. if (entityName.equals(obj.getClass().getSimpleName())) {
  22. getEventRecordMethod(entityName, obj,EventRecord.getDeleteInfo());
  23. }
  24. }
  25. }
  26. //修改时记录事件
  27. public boolean onFlushDirty(Object obj, Serializable id, Object[] currentState, Object[] previousState , String[] propertyNames, Type[] types){
  28. String[] entitys = EventRecord.getUpdateEntitysFireEvent();
  29. for (String entityName : entitys) {
  30. if (entityName.equals(obj.getClass().getSimpleName())) {
  31. getEventRecordMethod(entityName, obj, EventRecord.getUpdateInfo());
  32. }
  33. }
  34. return false;
  35. }
  36. public String onPrepareStatement(String arg0) {
  37. // TODO Auto-generated method stub
  38. return arg0;
  39. }
  40. //保存时记录事件
  41. public boolean onSave(Object obj, Serializable arg1, Object[] arg2, String[] arg3, Type[] arg4) throws CallbackException {
  42. // TODO Auto-generated method stub
  43. String[] entitys = EventRecord.getSaveEntitysFireEvent();
  44. for (String entityName : entitys) {
  45. if (entityName.equals(obj.getClass().getSimpleName())) {
  46. getEventRecordMethod(entityName, obj,EventRecord.getSaveInfo());
  47. }
  48. }
  49. return false;
  50. }
  51. //根据反射机制执行事件记录类中相应的函数
  52. public void getEventRecordMethod(String entityName,Object obj,String info){
  53. try {
  54. Class[] parameterTypes = {String.class,Class.forName(EventRecord.getPrefixPackageName()+entityName)};
  55. Method method = EventRecord.class.getMethod(EventRecord.getPrefixMethodName()+entityName, parameterTypes);
  56. Object[] objs = {info, Class.forName(EventRecord.getPrefixPackageName()+entityName).cast(obj)};
  57. method.invoke((EventRecord)ApplicationContextHolder.getBean("eventRecord"),objs);
  58. } catch (Exception e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. }
  62. }
package com.creawor.cbsms.util; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Iterator; import javacommon.util.ApplicationContextHolder; import org.hibernate.CallbackException; import org.hibernate.EntityMode; import org.hibernate.Interceptor; import org.hibernate.Transaction; import org.hibernate.type.Type; import com.creawor.cbsms.event.EventRecord; import com.creawor.cbsms.model.CbsChannel; import com.creawor.cbsms.model.CbsMessage; public class MyInterceptor implements Interceptor{ //删除时记录时间 public void onDelete(Object obj, Serializable arg1, Object[] arg2, String[] arg3, Type[] arg4) throws CallbackException { // TODO Auto-generated method stub String[] entitys = EventRecord.getDeleteEntitysFireEvent(); for (String entityName : entitys) { if (entityName.equals(obj.getClass().getSimpleName())) { getEventRecordMethod(entityName, obj,EventRecord.getDeleteInfo()); } } } //修改时记录事件 public boolean onFlushDirty(Object obj, Serializable id, Object[] currentState, Object[] previousState , String[] propertyNames, Type[] types){ String[] entitys = EventRecord.getUpdateEntitysFireEvent(); for (String entityName : entitys) { if (entityName.equals(obj.getClass().getSimpleName())) { getEventRecordMethod(entityName, obj, EventRecord.getUpdateInfo()); } } return false; } public String onPrepareStatement(String arg0) { // TODO Auto-generated method stub return arg0; } //保存时记录事件 public boolean onSave(Object obj, Serializable arg1, Object[] arg2, String[] arg3, Type[] arg4) throws CallbackException { // TODO Auto-generated method stub String[] entitys = EventRecord.getSaveEntitysFireEvent(); for (String entityName : entitys) { if (entityName.equals(obj.getClass().getSimpleName())) { getEventRecordMethod(entityName, obj,EventRecord.getSaveInfo()); } } return false; } //根据反射机制执行事件记录类中相应的函数 public void getEventRecordMethod(String entityName,Object obj,String info){ try { Class[] parameterTypes = {String.class,Class.forName(EventRecord.getPrefixPackageName()+entityName)}; Method method = EventRecord.class.getMethod(EventRecord.getPrefixMethodName()+entityName, parameterTypes); Object[] objs = {info, Class.forName(EventRecord.getPrefixPackageName()+entityName).cast(obj)}; method.invoke((EventRecord)ApplicationContextHolder.getBean("eventRecord"),objs); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }

事件记录类:

Java代码
  1. package com.creawor.cbsms.event;
  2. import java.sql.Timestamp;
  3. import javacommon.util.ApplicationContextHolder;
  4. import com.creawor.cbsms.dao.CbsEventDao;
  5. import com.creawor.cbsms.model.CbsBsc;
  6. import com.creawor.cbsms.model.CbsBscCells;
  7. import com.creawor.cbsms.model.CbsChannel;
  8. import com.creawor.cbsms.model.CbsEvent;
  9. import com.creawor.cbsms.model.CbsUserRegister;
  10. import com.creawor.cbsms.service.CbsEventManager;
  11. import com.creawor.security.model.PermUser;
  12. public class EventRecord {
  13. // 保存时要记录事件的对象
  14. private static String[] saveEntitysFireEvent = { "CbsBscCells",
  15. "CbsChannel",
  16. "CbsBsc" };
  17. // 删除时要记录事件的对象
  18. private static String[] deleteEntitysFireEvent = { "CbsBscCells",
  19. "CbsChannel",
  20. "CbsBsc" };
  21. // 更新时要记录事件的对象
  22. private static String[] updateEntitysFireEvent = { "CbsBscCells",
  23. "CbsChannel",
  24. "CbsBsc" };
  25. // 包的前缀,反射得到类时使用
  26. private static String prefixPackageName = "com.creawor.cbsms.model.";
  27. // 记录该次操作的登录用户名:EventRecord为session范围
  28. private String userName;
  29. // 调用函数的前缀,反射执行函数时使用
  30. private static String prefixMethodName = "recordFor";
  31. // 执行save时,事件描述
  32. private static String saveInfo = "创建";
  33. // 执行delete时,事件描述
  34. private static String deleteInfo = "删除";
  35. // 执行update时,事件描述
  36. private static String updateInfo = "修改";
  37. private CbsEventManager cbsEventManager;
  38. // spring自动注入
  39. public void setCbsEventManager(CbsEventManager cbsEventManager) {
  40. this.cbsEventManager = cbsEventManager;
  41. }
  42. public void recordForCbsChannel(String desc, CbsChannel channel) {
  43. StringBuffer eventDesc = new StringBuffer(desc);
  44. eventDesc.append("频道" + channel.getChannelName()).append("[").append(
  45. channel.getChannelNum()).append("]");
  46. record(eventDesc.toString(), null);
  47. }
  48. public void recordForCbsBscCells(String desc, CbsBscCells cell) {
  49. StringBuffer eventDesc = new StringBuffer(desc);
  50. eventDesc.append("小区"+cell.getCellName()).append("[").append(
  51. cell.getCellId()).append("]");
  52. record(eventDesc.toString(), null);
  53. }
  54. public void record(String eventDesc, String eventOrigin) {
  55. CbsEvent event = new CbsEvent();
  56. event.setEventDesc(userName + "   " + eventDesc);
  57. event.setEventOrigin(eventOrigin);
  58. event.setStartTime(new Timestamp(System.currentTimeMillis()));
  59. cbsEventManager.save(event);
  60. }
  61. public void setUserName(String userName) {
  62. this.userName = userName;
  63. }
  64. public static String[] getDeleteEntitysFireEvent() {
  65. return deleteEntitysFireEvent;
  66. }
  67. public static String[] getSaveEntitysFireEvent() {
  68. return saveEntitysFireEvent;
  69. }
  70. public static String[] getUpdateEntitysFireEvent() {
  71. return updateEntitysFireEvent;
  72. }
  73. public static String getPrefixPackageName() {
  74. return prefixPackageName;
  75. }
  76. public static void setPrefixPackageName(String prefixPackageName) {
  77. EventRecord.prefixPackageName = prefixPackageName;
  78. }
  79. public static String getPrefixMethodName() {
  80. return prefixMethodName;
  81. }
  82. public static String getDeleteInfo() {
  83. return deleteInfo;
  84. }
  85. public static String getSaveInfo() {
  86. return saveInfo;
  87. }
  88. public static String getUpdateInfo() {
  89. return updateInfo;
  90. }
  91. }
package com.creawor.cbsms.event; import java.sql.Timestamp; import javacommon.util.ApplicationContextHolder; import com.creawor.cbsms.dao.CbsEventDao; import com.creawor.cbsms.model.CbsBsc; import com.creawor.cbsms.model.CbsBscCells; import com.creawor.cbsms.model.CbsChannel; import com.creawor.cbsms.model.CbsEvent; import com.creawor.cbsms.model.CbsUserRegister; import com.creawor.cbsms.service.CbsEventManager; import com.creawor.security.model.PermUser; public class EventRecord { // 保存时要记录事件的对象 private static String[] saveEntitysFireEvent = { "CbsBscCells", "CbsChannel", "CbsBsc" }; // 删除时要记录事件的对象 private static String[] deleteEntitysFireEvent = { "CbsBscCells", "CbsChannel", "CbsBsc" }; // 更新时要记录事件的对象 private static String[] updateEntitysFireEvent = { "CbsBscCells", "CbsChannel", "CbsBsc" }; // 包的前缀,反射得到类时使用 private static String prefixPackageName = "com.creawor.cbsms.model."; // 记录该次操作的登录用户名:EventRecord为session范围 private String userName; // 调用函数的前缀,反射执行函数时使用 private static String prefixMethodName = "recordFor"; // 执行save时,事件描述 private static String saveInfo = "创建"; // 执行delete时,事件描述 private static String deleteInfo = "删除"; // 执行update时,事件描述 private static String updateInfo = "修改"; private CbsEventManager cbsEventManager; // spring自动注入 public void setCbsEventManager(CbsEventManager cbsEventManager) { this.cbsEventManager = cbsEventManager; } public void recordForCbsChannel(String desc, CbsChannel channel) { StringBuffer eventDesc = new StringBuffer(desc); eventDesc.append("频道" + channel.getChannelName()).append("[").append( channel.getChannelNum()).append("]"); record(eventDesc.toString(), null); } public void recordForCbsBscCells(String desc, CbsBscCells cell) { StringBuffer eventDesc = new StringBuffer(desc); eventDesc.append("小区"+cell.getCellName()).append("[").append( cell.getCellId()).append("]"); record(eventDesc.toString(), null); }  public void record(String eventDesc, String eventOrigin) {     CbsEvent event = new CbsEvent();     event.setEventDesc(userName + "   " + eventDesc);    event.setEventOrigin(eventOrigin);    event.setStartTime(new Timestamp(System.currentTimeMillis()));    cbsEventManager.save(event);  } public void setUserName(String userName) { this.userName = userName; } public static String[] getDeleteEntitysFireEvent() { return deleteEntitysFireEvent; } public static String[] getSaveEntitysFireEvent() { return saveEntitysFireEvent; } public static String[] getUpdateEntitysFireEvent() { return updateEntitysFireEvent; } public static String getPrefixPackageName() { return prefixPackageName; } public static void setPrefixPackageName(String prefixPackageName) { EventRecord.prefixPackageName = prefixPackageName; } public static String getPrefixMethodName() { return prefixMethodName; } public static String getDeleteInfo() { return deleteInfo; } public static String getSaveInfo() { return saveInfo; } public static String getUpdateInfo() { return updateInfo; } }

其中EventRecord 在spring中的配置为:

Java代码
  1. <bean id="eventRecord" class="com.creawor.cbsms.event.EventRecord"  scope="session" autowire="byName"/>
<bean id="eventRecord" class="com.creawor.cbsms.event.EventRecord" scope="session" />

EventRecord 为session范围可以使字段userName记录每次登录人员的姓名

具体在每次登录后从spring容器中得到EventRecord然后set其userName即可!

最后一步要想让session范围生效还要在web.xml中添加配置:

Java代码
  1. <web-app>
  2. ...
  3. <listener>
  4. <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  5. </listener>
  6. ...
  7. </web-app>
<web-app> ... <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> ... </web-app>

这样如果想要记录一个业务bean增删改的操作只需在EventRecord中设置saveEntitysFireEvent,deleteEntitysFireEvent,updateEntitysFireEvent属性即可,同样也可使用配置文件配置,这样都可以使日志和事件的记录变得很简单!

根据hibernate拦截器实现可配置日志的记录相关推荐

  1. Hibernate 拦截器 Hibernate 监听器

    Hibernate拦截器(Interceptor)与事件监听器(Listener) 拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就 ...

  2. Hibernate 拦截器实例

    Hibernate 在操作数据库的时候要执行很多操作,这些动作对用户是透明的.这些操作主要是有拦截器和时间组成 hibernate拦截器可以拦截大多数动作,比如事务开始之后(afterTransact ...

  3. 【 第六章 拦截器,注解配置springMVC,springMVC执行流程】

    第六章 拦截器,注解配置springMVC,springMVC执行流程 1.拦截器: ①springMVC中的拦截器用于拦截控制器方法的执行. ②springMVC的拦截器需要实现HandlerInt ...

  4. 基于struts2拦截器实现用户操作日志记录

    2019独角兽企业重金招聘Python工程师标准>>> 这里基于struts2的拦截器来实现. 使用struts2拦截器拦截所有或者指定的请求,对用户操作过程中的:操作用户,操作时间 ...

  5. Hibernate 拦截器的使用--动态表名

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: jpa有多种实现的方式,但是最常见的还是采用Hibernate的方式实现,所以为了实现上述的业务,就必须得用到Hibe ...

  6. 使用Axios拦截器打印前端请求日志和后端后返回日志

    在main.ts引入 import axios from 'axios'; axios.defaults.baseURL = process.env.VUE_APP_SERVER;/*** axios ...

  7. java拦截器和过滤器配置,逆袭面经分享

    1. CAP 的由来 要理解 CAP,首先我们要清楚,为何会有人提出 CAP?他提出 CAP 是为了解决什么问题? 时间回到 1985 年,彼时,后来证明了 CAP 理论的 Lynch 教授此时给当时 ...

  8. springboot 添加拦截器之后中文乱码_springboot中配置了拦截器后,拦截器无效的解决方案之一...

    springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...

  9. Spring MVC拦截器(Interceptor)的配置及使用

    在开发一个网站时可能有这样的需求:某些页面只希望几个特定的用户浏览.对于这样的访问权限控制,应该如何实现呢?拦截器就可以实现上述需求.在Struts 2 框架中,拦截器是其重要的组成部分,Spring ...

最新文章

  1. python3官方最新下载-python3.7
  2. mysql2003错误如何解决_如何安装最新版redis6错误解决以及配置开机启动等
  3. python字符串能减吗_在python中减去两个字符串(Subtract two strings in python)
  4. DVbbs8.2入侵思路与总结
  5. amr 转mp3 java_JAVA 音频转换AMR 转MP3,OS,Linux cent os 7
  6. 微服务架构:如何用十步解耦你的系统?
  7. Maven学习总结(44)——Maven构建时生命周期及其常用集成命令详解
  8. 浏览器往返缓存(Back/Forward cache)问题的分析与解决
  9. 14. 调整数组顺序是奇数位于偶数前(C++版本)
  10. NMF扩展名是什么文件
  11. 80端口和443端口的作用
  12. 遇到服务器网络偶尔断线如何检查
  13. Could not obtain connection to query metadata : Public Key Retrieval is not allowed
  14. LINUX(socket)网络编程部分头文件归纳解释
  15. Firefox 不知道如何打开此地址,因为协议 (javascrpit) 未和任何程序关联.
  16. Java 春招、秋招面试总结
  17. 如何将JPG格式图片转换成BMP格式
  18. 嵌入式系统开发的架构和应用
  19. 如何获取请求端真实IP和远程主机IP详解
  20. html合并单元格后有虚线,excle单元格中间出现虚线/Excel表格里出现虚线,是怎么回事?...

热门文章

  1. python队列长度_[python模块]队列queue
  2. python scrapy框架 简书_python爬虫框架——Scrapy架构原理介绍
  3. cesium three性能比较_Go学习_21_Golang代码性能检测Benchmark
  4. Linux系统编程33:进程信号之详解信号的捕捉过程,用户态和内核态及其切换,sigaction和signal
  5. Ubuntu 18.04-20.04开机自动root用户登录(测试可用)
  6. HTML <input> required 属性
  7. Linux下查看串口信息
  8. android 瀑布流效果 保存地址
  9. 手眼标定eye-to-hand 示例:handeye_stationarycam_calibration
  10. c语言程序设计第四次作业——顺序结构