package com.vci.server.base.persistence.history; import java.lang.reflect.Field; import java.util.Date; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.collection.PersistentCollection; import org.hibernate.event.PostDeleteEvent; import org.hibernate.event.PostDeleteEventListener; import org.hibernate.event.PostInsertEvent; import org.hibernate.event.PostInsertEventListener; import org.hibernate.event.PostUpdateEvent; import org.hibernate.event.PostUpdateEventListener; import com.vci.common.annotaion.CustomAnnotaion; import com.vci.common.objects.AbstractEntity; import com.vci.common.objects.Historizable; import com.vci.common.utility.ObjectUtility; public class HistoryListener implements PostInsertEventListener, PostUpdateEventListener, PostDeleteEventListener { /** * */ private static final long serialVersionUID = -7290772791116036254L; public void onPostInsert(PostInsertEvent event) { if (event.getEntity() instanceof Historizable) { Historizable entity = (Historizable) event.getEntity(); if(!entity.getUserEntity().getUserName().equals("developer")&&!entity.getUserEntity().getUserName().equals("admin")) {//开发者模块不记录日志 HistoryEntry entry = new HistoryEntry(); String id = ObjectUtility.getNewObjectID36(); entry.setId(id); entry.setUser(entity.getUserEntity().getUserName()); entry.setIp(entity.getUserEntity().getIp()); entry.setModule(entity.getUserEntity().getModule()); entry.setOperationType(OperationType.CREATE); entry.setTimestamp(new Date()); entry.setHistorizableEntity(entity); recordHistory(event.getSession(), entry); } } } public void onPostUpdate(PostUpdateEvent event) { if (event.getEntity() instanceof Historizable) { Historizable entity = (Historizable) event.getEntity(); if(!entity.getUserEntity().getUserName().equals("developer")&&!entity.getUserEntity().getUserName().equals("admin")) {//开发者模块不记录日志 for (int i = 0; i < event.getState().length; i++) { // 更新前的值 Object oldValue = event.getOldState()[i]; // 更新后的新值 Object newValue = event.getState()[i]; // 跳过集合属性 if (newValue instanceof PersistentCollection) { continue; } if (oldValue != null && !oldValue.equals(newValue)) { //对于大对象不在此进行日志记录 //Historizable entity = (Historizable) event.getEntity(); HistoryEntry entry = new HistoryEntry(); String id = ObjectUtility.getNewObjectID36(); entry.setId(id); entry.setUser(entity.getUserEntity().getUserName()); entry.setIp(entity.getUserEntity().getIp()); entry.setModule(entity.getUserEntity().getModule()); // 取得属性名称 String pro = ""; Field f; try { f = entity.getClass().getDeclaredField(event.getPersister().getPropertyNames()[i]); if(f != null){ CustomAnnotaion an = f.getAnnotation(CustomAnnotaion.class); if(an != null){ pro = an.CustomDescription(); } }else{ pro = event.getPersister().getPropertyNames()[i]; } } catch (SecurityException e) { e.printStackTrace(); pro = event.getPersister().getPropertyNames()[i]; } catch (NoSuchFieldException e) { e.printStackTrace(); pro = event.getPersister().getPropertyNames()[i]; } entry.setProperty(pro); entry.setOperationType(OperationType.UPDATE); // 如果更改的属性是关联对象,则存储其id if (oldValue instanceof AbstractEntity) { entry.setPreviousValue(((AbstractEntity) oldValue).getId().toString()); } else { entry.setPreviousValue(oldValue != null ? oldValue.toString() : null); } if (newValue instanceof AbstractEntity) { entry.setNewValue(((AbstractEntity) newValue).getId().toString()); } else { entry.setNewValue(newValue != null ? newValue.toString() : null); } entry.setTimestamp(new Date()); entry.setHistorizableEntity(entity); recordHistory(event.getSession(), entry); } } } } } public void onPostDelete(PostDeleteEvent event) { if (event.getEntity() instanceof Historizable) { Historizable entity = (Historizable) event.getEntity(); if(!entity.getUserEntity().getUserName().equals("developer")&&!entity.getUserEntity().getUserName().equals("admin")) {//开发者模块不记录日志 HistoryEntry entry = new HistoryEntry(); String id = ObjectUtility.getNewObjectID36(); entry.setId(id); entry.setUser(entity.getUserEntity().getUserName()); entry.setIp(entity.getUserEntity().getIp()); entry.setModule(entity.getUserEntity().getModule()); entry.setOperationType(OperationType.DELETE); entry.setTimestamp(new Date()); entry.setHistorizableEntity(entity); recordHistory(event.getSession(), entry); } } } private void recordHistory(Session session, HistoryEntry entry){ Session tempSession = session.getSessionFactory().openSession(); Transaction tx = tempSession.beginTransaction(); try { tempSession.save(entry); tempSession.flush(); tx.commit(); } catch (Exception ex) { ex.printStackTrace(); try { tx.rollback(); } catch (Exception e) { } } finally { try { tempSession.close(); } catch (Exception e) { } } } }