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) {
|
}
|
}
|
}
|
}
|