日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 根据hibernate拦截器实现可配置日志的记录 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(duì)于日志和事件的記錄在每個(gè)項(xiàng)目中都會(huì)用到,如果在每個(gè)manager層中觸發(fā)時(shí)間記錄的話,會(huì)比較難以擴(kuò)展和維護(hù),所以可配置的日志和事件記錄在項(xiàng)目中會(huì)用到!

首先在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{ ??
  • ??
  • ??
  • ?????//刪除時(shí)記錄時(shí)間 ??
  • ????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()); ??
  • ????????????} ??
  • ????????} ??
  • ??
  • ????} ??
  • ????????????????//修改時(shí)記錄事件 ??
  • ?????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; ??
  • ????} ??
  • ???????????????//保存時(shí)記錄事件 ??
  • ????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; ??
  • ????} ??
  • ???????????????//根據(jù)反射機(jī)制執(zhí)行事件記錄類中相應(yīng)的函數(shù) ??
  • ????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{ //刪除時(shí)記錄時(shí)間 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()); } } } //修改時(shí)記錄事件 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; } //保存時(shí)記錄事件 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; } //根據(jù)反射機(jī)制執(zhí)行事件記錄類中相應(yīng)的函數(shù) 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?{ ??
  • ???? ??
  • ???????????????//?保存時(shí)要記錄事件的對(duì)象 ??
  • ????private?static?String[]?saveEntitysFireEvent?=?{?"CbsBscCells", ??
  • ?????????????????????????????????????????????????????"CbsChannel",? ??
  • ?????????????????????????????????????????????????????"CbsBsc"?}; ??
  • ??
  • ????//?刪除時(shí)要記錄事件的對(duì)象 ??
  • ????private?static?String[]?deleteEntitysFireEvent?=?{?"CbsBscCells", ??
  • ???????????????????????????????????????????????????????"CbsChannel", ??
  • ???????????????????????????????????????????????????????"CbsBsc"?}; ??
  • ??
  • ????//?更新時(shí)要記錄事件的對(duì)象 ??
  • ????private?static?String[]?updateEntitysFireEvent?=?{?"CbsBscCells", ??
  • ???????????????????????????????????????????????????????"CbsChannel",? ??
  • ???????????????????????????????????????????????????????"CbsBsc"?}; ??
  • ??
  • ????//?包的前綴,反射得到類時(shí)使用 ??
  • ????private?static?String?prefixPackageName?=?"com.creawor.cbsms.model."; ??
  • ???? ??
  • ????//?記錄該次操作的登錄用戶名:EventRecord為session范圍 ??
  • ????private?String?userName; ??
  • ??
  • ????//?調(diào)用函數(shù)的前綴,反射執(zhí)行函數(shù)時(shí)使用 ??
  • ????private?static?String?prefixMethodName?=?"recordFor"; ??
  • ??
  • ????//?執(zhí)行save時(shí),事件描述 ??
  • ????private?static?String?saveInfo?=?"創(chuàng)建"; ??
  • ??
  • ????//?執(zhí)行delete時(shí),事件描述 ??
  • ????private?static?String?deleteInfo?=?"刪除"; ??
  • ??
  • ????//?執(zhí)行update時(shí),事件描述 ??
  • ????private?static?String?updateInfo?=?"修改"; ??
  • ??
  • ???? ??
  • ??
  • ????private?CbsEventManager?cbsEventManager; ??
  • ??
  • ????//?spring自動(dòng)注入 ??
  • ????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("小區(qū)"+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 { // 保存時(shí)要記錄事件的對(duì)象 private static String[] saveEntitysFireEvent = { "CbsBscCells", "CbsChannel", "CbsBsc" }; // 刪除時(shí)要記錄事件的對(duì)象 private static String[] deleteEntitysFireEvent = { "CbsBscCells", "CbsChannel", "CbsBsc" }; // 更新時(shí)要記錄事件的對(duì)象 private static String[] updateEntitysFireEvent = { "CbsBscCells", "CbsChannel", "CbsBsc" }; // 包的前綴,反射得到類時(shí)使用 private static String prefixPackageName = "com.creawor.cbsms.model."; // 記錄該次操作的登錄用戶名:EventRecord為session范圍 private String userName; // 調(diào)用函數(shù)的前綴,反射執(zhí)行函數(shù)時(shí)使用 private static String prefixMethodName = "recordFor"; // 執(zhí)行save時(shí),事件描述 private static String saveInfo = "創(chuàng)建"; // 執(zhí)行delete時(shí),事件描述 private static String deleteInfo = "刪除"; // 執(zhí)行update時(shí),事件描述 private static String updateInfo = "修改"; private CbsEventManager cbsEventManager; // spring自動(dòng)注入 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("小區(qū)"+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>

    ?這樣如果想要記錄一個(gè)業(yè)務(wù)bean增刪改的操作只需在EventRecord中設(shè)置saveEntitysFireEvent,deleteEntitysFireEvent,updateEntitysFireEvent屬性即可,同樣也可使用配置文件配置,這樣都可以使日志和事件的記錄變得很簡(jiǎn)單!

    總結(jié)

    以上是生活随笔為你收集整理的根据hibernate拦截器实现可配置日志的记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。