對于日志和事件的記錄在每個項目中都會用到,如果在每個manager層中觸發時間記錄的話,會比較難以擴展和維護,所以可配置的日志和事件記錄在項目中會用到!
首先在spring的配置文件中加入hibernate攔截器
Java代碼
<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攔截器為:
Java代碼
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(); } }
?事件記錄類:
Java代碼
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中的配置為:
Java代碼
<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代碼
<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拦截器实现可配置日志的记录的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。