hibernate 监听器记录数据变化信息
2017-10-13 16:12
423 查看
package com.ezparking.web; import com.ezparking.model.CustomerServe; import com.ezparking.model.UserDataLog; import com.ezparking.util.WebUtils; import org.hibernate.event.internal.DefaultLoadEventListener; import org.hibernate.event.service.spi.EventListenerRegistry; import org.hibernate.event.spi.*; import org.hibernate.internal.SessionFactoryImpl; import org.hibernate.persister.entity.EntityPersister; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.servlet.http.HttpServletRequest; import java.sql.Timestamp; import java.util.Optional; @Component public class UserDataLogListener extends DefaultLoadEventListener implements PostUpdateEventListener, PostInsertEventListener, PostDeleteEventListener { private static final String[] OBJECTS_SKIPPED = {"PoiStatusLog", "CustomerLog", "UserLog", "UserDataLog", "UserCoordinate"}; private static final Logger logger = LoggerFactory.getLogger(UserDataLogListener.class); @Autowired private EntityManagerFactory entityManagerFactory; @PostConstruct public void registerListeners() { logger.info("register listeners ******"); SessionFactoryImpl sessionFactoryImpl = entityManagerFactory.unwrap(SessionFactoryImpl.class); EventListenerRegistry eventListenerRegistry = sessionFactoryImpl.getServiceRegistry().getService(EventListenerRegistry.class); eventListenerRegistry.getEventListenerGroup(EventType.POST_INSERT).appendListener(this); eventListenerRegistry.getEventListenerGroup(EventType.POST_UPDATE).appendListener(this); eventListenerRegistry.getEventListenerGroup(EventType.POST_DELETE).appendListener(this); } @Override public void onPostInsert(PostInsertEvent event) { logger.info("insert start***********"); if (!requiresLog(event.getEntity().getClass())) { return; } if (StringUtils.isEmpty(getUserId()) || StringUtils.isEmpty(getLogId())) { return; } logger.debug(event.getEntity() + " inserted"); long startTime = System.currentTimeMillis(); StringBuilder fields = new StringBuilder(); StringBuilder afterValues = new StringBuilder(); StringBuilder remark = new StringBuilder(); for (int i = 0; i < event.getState().length; i++) { fields.append(event.getPersister().getPropertyNames()[i] + "|"); afterValues.append(event.getState()[i] + "|"); remark.append(event.getPersister().getPropertyNames()[i] + ": "); remark.append(event.getState()[i] + "\r\n"); } UserDataLog userDataLog = new UserDataLog(); userDataLog.setUserId(getUserId()); userDataLog.setLogId(getLogId()); userDataLog.setFields(fields.toString()); userDataLog.setAfterValues(afterValues.toString()); userDataLog.setRemark(remark.toString()); userDataLog.setObject(event.getEntity().getClass().getSimpleName()); userDataLog.setObjectKey(event.getId().toString()); userDataLog.setOperation("INSERT"); userDataLog.setLogTime(new Timestamp(System.currentTimeMillis())); this.persistLog(userDataLog); long endTime = System.currentTimeMillis(); logger.debug("日志时间: " + (endTime - startTime) + "ms"); } @Override public void onPostUpdate(PostUpdateEvent event) { logger.info("update start***********"); if (!requiresLog(event.getEntity().getClass())) { return; } if (StringUtils.isEmpty(getUserId()) || StringUtils.isEmpty(getLogId())) { return; } logger.debug(event.getEntity() + " updated"); long startTime = System.currentTimeMillis(); StringBuilder fields = new StringBuilder(); StringBuilder beforeValues = new StringBuilder(); StringBuilder afterValues = new StringBuilder(); StringBuilder remark = new StringBuilder(); for (int i = 0; i < event.getState().length; i++) { // Object oldValue = event.getOldState()[i]; // Object newValue = event.getState()[i]; // String propertyName = event.getPersister().getPropertyNames()[i]; // logger.info(propertyName + ": " + oldValue + " -> " + newValue); fields.append(event.getPersister().getPropertyNames()[i] + "|"); beforeValues.append(event.getOldState()[i] + "|"); afterValues.append(event.getState()[i] + "|"); } for (int i = 0; i < event.getDirtyProperties().length; i++) { int j = event.getDirtyProperties()[i]; remark.append(event.getPersister().getPropertyNames()[j] + ": "); remark.append(event.getOldState()[j] + " -> "); remark.append(event.getState()[j] + "\r\n"); } UserDataLog userDataLog = new UserDataLog(); userDataLog.setUserId(getUserId()); userDataLog.setLogId(getLogId()); userDataLog.setFields(fields.toString()); userDataLog.setBeforeValues(beforeValues.toString()); userDataLog.setAfterValues(afterValues.toString()); //dl.setFields(serialize(event.getPersister().getPropertyNames())); //dl.setBeforeValues(serialize(event.getOldState())); //dl.setAfterValues(serialize(event.getState())); userDataLog.setRemark(remark.toString()); userDataLog.setObject(event.getEntity().getClass().getSimpleName()); userDataLog.setObjectKey(event.getId().toString()); userDataLog.setOperation("UPDATE"); userDataLog.setLogTime(new Timestamp(System.currentTimeMillis())); this.persistLog(userDataLog); long endTime = System.currentTimeMillis(); logger.debug("日志时间: " + (endTime - startTime) + "ms"); } @Override public void onPostDelete(PostDeleteEvent event) { logger.info("delete start***********"); if (!requiresLog(event.getEntity().getClass())) { return; } if (StringUtils.isEmpty(getUserId()) || StringUtils.isEmpty(getLogId())) { return; } logger.debug(event.getEntity() + " removed"); long startTime = System.currentTimeMillis(); StringBuilder fields = new StringBuilder(); StringBuilder beforeValues = new StringBuilder(); UserDataLog userDataLog = new UserDataLog(); userDataLog.setUserId(getUserId()); userDataLog.setLogId(getLogId()); userDataLog.setFields(fields.toString()); userDataLog.setBeforeValues(beforeValues.toString()); userDataLog.setObject(event.getEntity().getClass().getSimpleName()); userDataLog.setObjectKey(event.getId().toString()); userDataLog.setOperation("REMOVE"); userDataLog.setLogTime(new Timestamp(System.currentTimeMillis())); this.persistLog(userDataLog); long endTime = System.currentTimeMillis(); logger.debug("日志时间: " + (endTime - startTime) + "ms"); } private void persistLog(UserDataLog userDataLog) { EntityManager em = entityManagerFactory.createEntityManager(); try { em.getTransaction().begin(); em.persist(userDataLog); em.getTransaction().commit(); } finally { em.close(); } } @Override public boolean requiresPostCommitHanding(EntityPersister persister) { return false; } private boolean requiresLog(Class<?> clazz) { for (String clsName : OBJECTS_SKIPPED) { if (clsName.equals(clazz.getSimpleName())) { return false; } } return true; } private Integer getLogId() { HttpServletRequest request = WebUtils.getHttpRequest(); if (request == null) { return null; } Integer logId = (Integer) request.getSession().getAttribute("logId"); return logId; } private String getUserId() { HttpServletRequest request = WebUtils.getHttpRequest(); if (request == null) { return null; } CustomerServe customerServe = (CustomerServe) request.getAttribute("serve"); if (customerServe == null || StringUtils.isEmpty(customerServe.getApp())) { return null; } return Optional.ofNullable(customerServe.getDeviceId()).orElse(customerServe.getLinkedKey()); } }
相关文章推荐
- 数据库交易记录--如何添加审计信息到闪回归档数据以替换操作日志表
- DataMark 数据云便签,记录跟踪商品信息
- Guava Cache 数据变化实现回调的监听器RemovalListener
- GridView使用技巧之:新增记录、GridView内数据验证、删除信息提示等
- MySQL] 行列转换变化各种方法实现总结(行变列报表统计、列变行数据记录统计等)
- 关于数据文件头信息记录
- 【D3.JS数据可视化实战记录】绘制动态状态变化趋势图
- 数据同步中一表操作的增删改反映到记录数据变化的表datainfo上的触发器写法
- MoveIt 拖动机械臂并记录数据信息
- hibernate新增一条带有外键的数据记录的时候,一定要先将外键对应的对象持久化
- 物料信息记录中几个常见的数据表
- ASP+MSSQL获取最新最后添加数据信息的ID记录值
- 初学hibernate 查找数据—问题记录
- 删除草稿信息之后 threads表的数据没有发生变化
- hibernate不自动建表及报错信息记录
- 两个实体类比较,记录前后的数据变化,精确到每列的值
- Repeater在无数据记录时显示类似GridView的无信息内容
- 批量更新具有数千属性列的数据表的记录信息(SQL Server 2005)
- 用SQLServer实现数据表中,将任意一条记录信息移动到该表中的任意位置
- PL/SQL 一个数据对象一个事务(且记录错误信息到处理对象)(rollback,submit)