根据hibernate拦截器实现可配置日志的记录
对于日志和事件的记录在每个项目中都会用到,如果在每个manager层中触发时间记录的话,会比较难以扩展和维护,所以可配置的日志和事件记录在项目中会用到!
首先在spring的配置文件中加入hibernate拦截器
- <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" />
<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拦截器为:
- 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();
- }
- }
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(); } }
事件记录类:
- 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;
- }
- }
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中的配置为:
- <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中添加配置:
- <web-app>
- ...
- <listener>
- <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
- </listener>
- ...
- </web-app>
<web-app> ... <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> ... </web-app>
这样如果想要记录一个业务bean增删改的操作只需在EventRecord中设置saveEntitysFireEvent,deleteEntitysFireEvent,updateEntitysFireEvent属性即可,同样也可使用配置文件配置,这样都可以使日志和事件的记录变得很简单!
根据hibernate拦截器实现可配置日志的记录相关推荐
- Hibernate 拦截器 Hibernate 监听器
Hibernate拦截器(Interceptor)与事件监听器(Listener) 拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就 ...
- Hibernate 拦截器实例
Hibernate 在操作数据库的时候要执行很多操作,这些动作对用户是透明的.这些操作主要是有拦截器和时间组成 hibernate拦截器可以拦截大多数动作,比如事务开始之后(afterTransact ...
- 【 第六章 拦截器,注解配置springMVC,springMVC执行流程】
第六章 拦截器,注解配置springMVC,springMVC执行流程 1.拦截器: ①springMVC中的拦截器用于拦截控制器方法的执行. ②springMVC的拦截器需要实现HandlerInt ...
- 基于struts2拦截器实现用户操作日志记录
2019独角兽企业重金招聘Python工程师标准>>> 这里基于struts2的拦截器来实现. 使用struts2拦截器拦截所有或者指定的请求,对用户操作过程中的:操作用户,操作时间 ...
- Hibernate 拦截器的使用--动态表名
2019独角兽企业重金招聘Python工程师标准>>> 摘要: jpa有多种实现的方式,但是最常见的还是采用Hibernate的方式实现,所以为了实现上述的业务,就必须得用到Hibe ...
- 使用Axios拦截器打印前端请求日志和后端后返回日志
在main.ts引入 import axios from 'axios'; axios.defaults.baseURL = process.env.VUE_APP_SERVER;/*** axios ...
- java拦截器和过滤器配置,逆袭面经分享
1. CAP 的由来 要理解 CAP,首先我们要清楚,为何会有人提出 CAP?他提出 CAP 是为了解决什么问题? 时间回到 1985 年,彼时,后来证明了 CAP 理论的 Lynch 教授此时给当时 ...
- springboot 添加拦截器之后中文乱码_springboot中配置了拦截器后,拦截器无效的解决方案之一...
springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...
- Spring MVC拦截器(Interceptor)的配置及使用
在开发一个网站时可能有这样的需求:某些页面只希望几个特定的用户浏览.对于这样的访问权限控制,应该如何实现呢?拦截器就可以实现上述需求.在Struts 2 框架中,拦截器是其重要的组成部分,Spring ...
最新文章
- python3官方最新下载-python3.7
- mysql2003错误如何解决_如何安装最新版redis6错误解决以及配置开机启动等
- python字符串能减吗_在python中减去两个字符串(Subtract two strings in python)
- DVbbs8.2入侵思路与总结
- amr 转mp3 java_JAVA 音频转换AMR 转MP3,OS,Linux cent os 7
- 微服务架构:如何用十步解耦你的系统?
- Maven学习总结(44)——Maven构建时生命周期及其常用集成命令详解
- 浏览器往返缓存(Back/Forward cache)问题的分析与解决
- 14. 调整数组顺序是奇数位于偶数前(C++版本)
- NMF扩展名是什么文件
- 80端口和443端口的作用
- 遇到服务器网络偶尔断线如何检查
- Could not obtain connection to query metadata : Public Key Retrieval is not allowed
- LINUX(socket)网络编程部分头文件归纳解释
- Firefox 不知道如何打开此地址,因为协议 (javascrpit) 未和任何程序关联.
- Java 春招、秋招面试总结
- 如何将JPG格式图片转换成BMP格式
- 嵌入式系统开发的架构和应用
- 如何获取请求端真实IP和远程主机IP详解
- html合并单元格后有虚线,excle单元格中间出现虚线/Excel表格里出现虚线,是怎么回事?...
热门文章
- python队列长度_[python模块]队列queue
- python scrapy框架 简书_python爬虫框架——Scrapy架构原理介绍
- cesium three性能比较_Go学习_21_Golang代码性能检测Benchmark
- Linux系统编程33:进程信号之详解信号的捕捉过程,用户态和内核态及其切换,sigaction和signal
- Ubuntu 18.04-20.04开机自动root用户登录(测试可用)
- HTML <input> required 属性
- Linux下查看串口信息
- android 瀑布流效果 保存地址
- 手眼标定eye-to-hand 示例:handeye_stationarycam_calibration
- c语言程序设计第四次作业——顺序结构