`
easion_zms
  • 浏览: 95520 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类

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

    博客分类:
  • java
阅读更多

对于日志和事件的记录在每个项目中都会用到,如果在每个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" />

 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.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;
	}

	/**
	 * 存储频道修改的事件
	 * 
	 * @param desc
	 * @param channel
	 */
	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);
	}

	/**
	 * 存储小区修改的事件
	 * 
	 * @param desc
	 * @param cell
	 */
	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);
	}

	/**
	 * 存储**修改的事件
	 * 根据不同的对象拼接时间描述语句
	 * @param desc
	 * @param bsc
	 */
	 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"/>	     

 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>

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

分享到:
评论

相关推荐

    springmvc+hibernate 日志管理工具

    数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...

    spring hibernate 日志管理插件

    数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...

    Spring+Spring mvc+Hibernate+Bootstrap、企业级员工信息管理系统

    后台通过自定义注解结合一个访问拦截器实现整个系统的权限控制 04. 系统前台采用全采用的Html+jQuery开发 05. 系统前台与后台的交互全部使用 Ajax 异步请求 06. 自定义 SecureValid 注解实现权限的控制 07. ...

    hibernate 体系结构与配置 参考文档(html)

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    Hibernate+中文文档

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    HibernateAPI中文版.chm

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    hibernate3.2中文文档(chm格式)

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    Hibernate中文详细学习文档

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    Hibernate 中文 html 帮助文档

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    最全Hibernate 参考文档

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    Hibernate教程

    13. 拦截器与事件(Interceptors and events) 13.1. 拦截器(Interceptors) 13.2. 事件系统(Event system) 13.3. Hibernate的声明式安全机制 14. 批量处理(Batch processing) 14.1. 批量插入(Batch inserts) ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    Hibernate3+中文参考文档

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    hibernate3.04中文文档.chm

    13. 拦截器与事件(Interceptors and events) 13.1. 拦截器(Interceptors) 13.2. 事件系统(Event system) 13.3. Hibernate的声明式安全机制 14. 批量处理(Batch processing) 14.1. 批量插入(Batch ...

Global site tag (gtag.js) - Google Analytics