孤燈野火
          暢想的天空
          posts - 2,comments - 4,trackbacks - 0
          1.在JPA的配置文件中properties中引入監聽器
                       <property name="hibernate.ejb.event.post-insert" value="com.core.util.PostSaveEventListener" />
                                 <property name="hibernate.ejb.event.post-update" value="com.core.util.PostUpdateEventListiner" />
                      <property name="hibernate.ejb.event.post-delete" value="com.core.util.PostDeleteEventListener" />

          當JPA操作完成后,自動調用PostSaveEventListener,PostUpdateEventListiner,PostDeleteEventListener方法,支持聯合主鍵取主鍵值,不支持外鍵更新,不支持屬性為集合的變化記錄,如需要外鍵更新可根據需要擴展,以下為save、update、delete三個操作類
          package com.core.util;

          import java.io.Serializable;
          import java.lang.reflect.Field;
          import java.sql.Connection;
          import java.sql.PreparedStatement;
          import java.sql.SQLException;
          import java.util.ArrayList;
          import java.util.HashMap;
          import java.util.Iterator;
          import java.util.List;
          import java.util.Map;
          import java.util.Set;

          import org.hibernate.event.spi.PostInsertEvent;
          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;

          import com.unilogi.core.bean.LoginUserInfo;

          /**
           * 
           * <p>
           * PostSaveEventListener.
           * </p>
           * 
           * 
          @author liu_dawei
           
          */

          @SuppressWarnings(
          "rawtypes""unchecked""serial" })
          public class PostSaveEventListener extends org.hibernate.ejb.event.EJB3PostInsertEventListener {

              
          private static final Logger logger = LoggerFactory.getLogger(PostSaveEventListener.class);

              
          private static PostSaveEventListener instance = null;

              
          public static PostSaveEventListener getInstance() {

                  
          if (null == instance) {

                      instance 
          = new PostSaveEventListener();
                  }

                  
          return instance;
              }


              
          private enum OperationType {
                  CREATE, UPDATE, DELETE
              }


              @Override
              
          public void onPostInsert(PostInsertEvent event) {

                  
          try {
                      Connection con 
          = event.getSession().connection();

                      Map map 
          = getContent(event);

                      postOperation(con, map, OperationType.CREATE.ordinal());
                  }
           catch (Exception e) {
                      logger.error(e.getMessage());
                  }


              }


              
          /**
               * con: dataBase Connection map: result map
               * <p>
               * </p>
               * 
               * 
          @param con
               * 
          @param map
               * 
          @param operation
               * 
          @throws Exception
               
          */

              
          public void postOperation(Connection con, Map map, int operation) throws Exception {

                  
          try {
                      String tableName 
          = map.get("tableName"== null ? "" : map.get("tableName").toString();
                      StringBuffer PKNameBuffer 
          = new StringBuffer();
                      
          if (null != map.get("pkName")) {
                          List pkList 
          = (List) map.get("pkName");
                          
          for (int i = 0; i < pkList.size(); i++{
                              
          if (false == PKNameBuffer.toString().equals("")) {
                                  PKNameBuffer.append(
          ",");
                              }

                              Map tempMap 
          = (Map) pkList.get(i);
                              Set tempsets 
          = tempMap.keySet();
                              Iterator it 
          = tempsets.iterator();
                              
          while (it.hasNext()) {
                                  Object obj 
          = it.next();
                                  PKNameBuffer.append(obj.toString()).append(
          "=").append(tempMap.get(obj));
                              }


                          }

                      }


                      String pkName 
          = PKNameBuffer.toString();

                      con.setAutoCommit(
          false);

                      String sql 
          = "insert into M_Data_Log(PK_Value, Description, Old_Value, New_Value, Operation_Type, Table_Name, User_Id,Update_Time, Data_Log_Id) "
                              
          + "values(?,?,?,?,?,?,?,CURRENT_TIMESTAMP, M_Data_LOG_SEQ.nextval)";

                      PreparedStatement ps 
          = con.prepareStatement(sql);
                      ps.setString(
          1, pkName);
                      
          if (operation == OperationType.CREATE.ordinal()) {
                          ps.setString(
          2"save " + tableName);
                      }

                      
          if (operation == OperationType.UPDATE.ordinal()) {
                          ps.setString(
          2"update " + tableName);
                      }

                      
          if (operation == OperationType.DELETE.ordinal()) {
                          ps.setString(
          2"delete " + tableName);
                      }


                      ps.setString(
          3, map.get("previousproperty"== null ? "" : map.get("previousproperty").toString());
                      ps.setString(
          4, map.get("afterproperty"== null ? "" : map.get("afterproperty").toString());
                      ps.setLong(
          5, operation);
                      ps.setString(
          6, tableName);

                      LoginUserInfo loginUserInfo 
          = SessionInfoManager.getContextInstance(
                              MessageManager.getInstance().getHttpServletRequest()).getCurrentUser();

                      ps.setInt(
                              
          7,
                              loginUserInfo 
          == null ? Integer.parseInt("0") : Integer.parseInt(String.valueOf(loginUserInfo
                                      .getUserId())));

                      ps.execute();
                      con.commit();
                      ps.close();
                  }
           catch (Exception e) {

                      
          if (null != con) {
                          
          try {
                              con.rollback();
                          }
           catch (SQLException e1) {
                              
          // TODO Auto-generated catch block
                              e1.printStackTrace();
                          }

                      }


                      
          throw new Exception(e.getMessage());
                  }
           finally {
                      
          try {
                          
          if (null != con && con.isClosed() == false{
                              con.close();
                          }

                      }
           catch (SQLException e) {
                          e.printStackTrace();
                      }

                  }


              }


              
          public Map getContent(PostInsertEvent event) throws IllegalArgumentException, IllegalAccessException,
                      InstantiationException, ClassNotFoundException 
          {

                  Map map 
          = new HashMap();

                  
          // get table
                  Serializable[] serializables = event.getPersister().getPropertySpaces();
                  map.put(
          "tableName", serializables[0]);

                  
          // get PK
                  String identifierPropertyName = event.getPersister().getIdentifierPropertyName();

                  Field[] tempFields 
          = event.getEntity().getClass().getDeclaredFields();
                  
          for (int i = 0; i < tempFields.length; i++{
                      
          if (tempFields[i].getName().equals(identifierPropertyName)) {
                          List tempList 
          = new ArrayList();
                          
          // if PK is Primitive
                          if (event.getPersister().getPropertyType(tempFields[i].getName()).isEntityType() == false{
                              Map tempMap 
          = new HashMap();
                              tempFields[i].setAccessible(
          true);
                              tempMap.put(tempFields[i].getName(), tempFields[i].get(event.getEntity()));
                              tempList.add(tempMap);
                          }
           else {
                              Class obj 
          = event.getId().getClass();
                              Field[] objFields 
          = obj.getDeclaredFields();
                              
          for (int j = 0; j < objFields.length; j++{
                                  
          if (objFields[j].getName().equals("serialVersionUID")) {
                                      
          continue;
                                  }

                                  objFields[j].setAccessible(
          true);
                                  Map tempMap 
          = new HashMap();
                                  tempMap.put(objFields[j].getName(), objFields[j].get(event.getId()));
                                  tempList.add(tempMap);
                              }


                          }


                          map.put(
          "pkName", tempList);

                      }

                  }


                  
          // get new value
                  StringBuffer buffer = new StringBuffer();

                  
          for (int i = 0; i < event.getState().length; i++{
                      
          if (false == buffer.toString().equals("")) {
                          buffer.append(
          ",");
                      }


                      
          // if collection or entity
                      if (event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isCollectionType()
                              
          || event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isEntityType()) {
                          
          continue;
                      }


                      buffer.append(event.getPersister().getPropertyNames()[i]).append(
          "=").append(event.getState()[i]);
                  }


                  map.put(
          "afterproperty", buffer.toString());

                  
          return map;
              }


          }

          package com.core.util;

          import java.io.Serializable;
          import java.lang.reflect.Field;
          import java.sql.Connection;
          import java.util.ArrayList;
          import java.util.HashMap;
          import java.util.List;
          import java.util.Map;

          import org.hibernate.event.spi.PostUpdateEvent;
          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;

          /**
           * 
           * <p>
           * PostUpdateEventListiner.
           * </p>
           * 
           * 
          @author liu_dawei
           
          */

          @SuppressWarnings(
          "rawtypes""unchecked""serial" })
          public class PostUpdateEventListiner extends org.hibernate.ejb.event.EJB3PostUpdateEventListener {

              
          private static final Logger logger = LoggerFactory.getLogger(PostUpdateEventListiner.class);

              
          private enum OperationType {
                  CREATE, UPDATE, DELETE
              }


              @Override
              
          public void onPostUpdate(PostUpdateEvent event) {

                  
          try {
                      Connection con 
          = event.getSession().connection();

                      Map map 
          = getContent(event);

                      PostSaveEventListener.getInstance().postOperation(con, map, OperationType.UPDATE.ordinal());
                  }
           catch (Exception e) {
                      logger.error(e.getMessage());
                  }


              }


              
          public Map getContent(PostUpdateEvent event) throws IllegalArgumentException, IllegalAccessException,
                      InstantiationException, ClassNotFoundException 
          {

                  Map map 
          = new HashMap();

                  
          // get table
                  Serializable[] serializables = event.getPersister().getPropertySpaces();
                  map.put(
          "tableName", serializables[0]);

                  
          // get PK
                  String identifierPropertyName = event.getPersister().getIdentifierPropertyName();

                  Field[] tempFields 
          = event.getEntity().getClass().getDeclaredFields();
                  
          for (int i = 0; i < tempFields.length; i++{
                      
          if (tempFields[i].getName().equals(identifierPropertyName)) {
                          List tempList 
          = new ArrayList();
                          
          // if PK is Primitive
                          if (event.getPersister().getPropertyType(tempFields[i].getName()).isEntityType() == false{
                              Map tempMap 
          = new HashMap();
                              tempFields[i].setAccessible(
          true);
                              tempMap.put(tempFields[i].getName(), tempFields[i].get(event.getEntity()));
                              tempList.add(tempMap);
                          }
           else {
                              Class obj 
          = event.getId().getClass();
                              Field[] objFields 
          = obj.getDeclaredFields();
                              
          for (int j = 0; j < objFields.length; j++{
                                  
          if (objFields[j].getName().equals("serialVersionUID")) {
                                      
          continue;
                                  }

                                  objFields[j].setAccessible(
          true);
                                  Map tempMap 
          = new HashMap();
                                  tempMap.put(objFields[j].getName(), objFields[j].get(event.getId()));
                                  tempList.add(tempMap);
                              }


                          }


                          map.put(
          "pkName", tempList);

                      }

                  }


                  
          // get change date
                  StringBuffer oldStateBuffer = new StringBuffer();
                  StringBuffer newStateBuffer 
          = new StringBuffer();
                  
          for (int i = 0; i < event.getState().length; i++{
                      
          // after
                      Object oldValue = event.getOldState()[i];
                      
          // previous
                      Object newValue = event.getState()[i];

                      
          if ((null == oldValue && null != newValue)
                              
          || (null != oldValue && null == newValue)
                              
          || (null != oldValue && null != newValue && false == oldValue.toString()
                                      .equals(newValue.toString()))) 
          {
                          
          if ((false == oldStateBuffer.toString().equals(""))) {
                              oldStateBuffer.append(
          ",");

                          }

                          
          if ((false == newStateBuffer.toString().equals(""))) {
                              newStateBuffer.append(
          ",");

                          }


                          
          // if collection or entity
                          if (event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isCollectionType()
                                  
          || event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i])
                                          .isEntityType()) 
          {
                              
          continue;
                          }


                          String propertyName 
          = event.getPersister().getPropertyNames()[i];
                          oldStateBuffer.append(propertyName).append(
          "=").append(oldValue);
                          newStateBuffer.append(propertyName).append(
          "=").append(newValue);

                      }


                  }

                  map.put(
          "previousproperty", oldStateBuffer.toString());
                  map.put(
          "afterproperty", newStateBuffer.toString());

                  
          return map;

              }


          }

          package com.core.util;

          import java.io.Serializable;
          import java.lang.reflect.Field;
          import java.sql.Connection;
          import java.util.ArrayList;
          import java.util.HashMap;
          import java.util.List;
          import java.util.Map;

          import org.hibernate.ejb.event.EJB3PostDeleteEventListener;
          import org.hibernate.event.spi.PostDeleteEvent;
          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;

          /**
           * 
           * <p>
           * PostDeleteEventListener.
           * </p>
           * 
           * 
          @author liu_dawei
           
          */

          @SuppressWarnings(
          "serial")
          public class PostDeleteEventListener extends EJB3PostDeleteEventListener {

              
          private static final Logger logger = LoggerFactory.getLogger(PostDeleteEventListener.class);

              
          private enum OperationType {
                  CREATE, UPDATE, DELETE
              }


              @SuppressWarnings(
          "rawtypes")
              @Override
              
          public void onPostDelete(PostDeleteEvent event) {

                  
          try {
                      Connection con 
          = event.getSession().connection();

                      Map map 
          = getContent(event);

                      PostSaveEventListener.getInstance().postOperation(con, map, OperationType.DELETE.ordinal());
                  }
           catch (Exception e) {
                      logger.error(e.getMessage());
                  }


              }


              @SuppressWarnings(
          "rawtypes""unchecked" })
              
          public Map getContent(PostDeleteEvent event) throws IllegalArgumentException, IllegalAccessException,
                      InstantiationException, ClassNotFoundException 
          {

                  Map map 
          = new HashMap();

                  
          // get table
                  Serializable[] serializables = event.getPersister().getPropertySpaces();
                  map.put(
          "tableName", serializables[0]);

                  
          // get PK
                  String identifierPropertyName = event.getPersister().getIdentifierPropertyName();

                  Field[] tempFields 
          = event.getEntity().getClass().getDeclaredFields();
                  
          for (int i = 0; i < tempFields.length; i++{
                      
          if (tempFields[i].getName().equals(identifierPropertyName)) {
                          List tempList 
          = new ArrayList();
                          
          // if PK is Primitive
                          if (event.getPersister().getPropertyType(tempFields[i].getName()).isEntityType() == false{
                              Map tempMap 
          = new HashMap();
                              tempFields[i].setAccessible(
          true);
                              tempMap.put(tempFields[i].getName(), tempFields[i].get(event.getEntity()));
                              tempList.add(tempMap);
                          }
           else {
                              Class obj 
          = event.getId().getClass();
                              Field[] objFields 
          = obj.getDeclaredFields();
                              
          for (int j = 0; j < objFields.length; j++{
                                  
          if (objFields[j].getName().equals("serialVersionUID")) {
                                      
          continue;
                                  }

                                  objFields[j].setAccessible(
          true);
                                  Map tempMap 
          = new HashMap();
                                  tempMap.put(objFields[j].getName(), objFields[j].get(event.getId()));
                                  tempList.add(tempMap);
                              }


                          }


                          map.put(
          "pkName", tempList);

                      }

                  }


                  
          // get old value
                  StringBuffer buffer = new StringBuffer();

                  
          for (int i = 0; i < event.getDeletedState().length; i++{
                      
          if (false == buffer.toString().equals("")) {
                          buffer.append(
          ",");
                      }


                      
          // if collection or entity
                      if (event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isCollectionType()
                              
          || event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isEntityType()) {
                          
          continue;
                      }


                      buffer.append(event.getPersister().getPropertyNames()[i]).append(
          "=").append(event.getDeletedState()[i]);
                  }


                  map.put(
          "previousproperty", buffer.toString());

                  
          return map;
              }


          }




           
          posted on 2012-11-01 11:28 孤飛燕 閱讀(5198) 評論(0)  編輯  收藏 所屬分類: Hibernate||JPA

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 抚宁县| 上林县| 湖北省| 阳春市| 印江| 五莲县| 涿州市| 普安县| 达拉特旗| 吴旗县| 沈阳市| 收藏| 莱阳市| 资兴市| 陇西县| 微博| 吉木乃县| 水富县| 儋州市| 宜春市| 襄樊市| 黔西| 赫章县| 三明市| 托里县| 泌阳县| 昌江| 黎川县| 永仁县| 密山市| 遂平县| 贵阳市| 邢台县| 江阴市| 罗山县| 隆子县| 壤塘县| 施甸县| 八宿县| 垫江县| 独山县|