我希望這個幫你,這是我怎麼做我的應用程序(休眠5.2.6):
import java.io.Serializable;
import java.util.Date;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.EmptyInterceptor;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.type.Type;
import com.demo.domain.AuditLog;
import com.demo.util.GlobUtil;
public class CustomInterceptor extends EmptyInterceptor
{
private static final Logger log = LogManager.getLogger(CustomInterceptor.class);
public static final String OPERATION_TYPE_INSERT = "INSERT";
public static final String OPERATION_TYPE_UPDATE = "UPDATE";
public static final String OPERATION_TYPE_DELETE = "DELETE";
public static final String OPERATION_TYPE_SELECT = "SELECT";
// delete
public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
{
auditTrail(entity, id, null, state, propertyNames, types, OPERATION_TYPE_DELETE);
}
// update
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types)
{
return auditTrail(entity, id, currentState, previousState, propertyNames, types, OPERATION_TYPE_UPDATE);
}
// select
public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
{
// return auditTrail(entity, id, null, state, propertyNames, types, OPERATION_TYPE_SELECT);
return true;
}
// insert
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
{
return auditTrail(entity, id, state, null, propertyNames, types, OPERATION_TYPE_INSERT);
}
private boolean auditable(Object entity)
{
return (entity instanceof Auditable);
}
private boolean auditTrail(Object entity, Serializable id, Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types, String operationType)
{
String prev = "";
String curr = "";
Session session = HibernateUtil.getSessionFactory().openSession();
if (!auditable(entity))
{
return false;
}
try
{
for (int index = 0; index < propertyNames.length; index++)
{
if (previousState != null)
{
prev = (previousState[index] == null) ? "" : previousState[index].toString();
}
if (currentState != null)
{
curr = (currentState[index] == null) ? "" : currentState[index].toString();
}
AuditLog auditLog = new AuditLog(id.toString(), entity.getClass().toString(),
propertyNames[index], prev, curr, operationType, GlobUtil.getUserName(), new Date());
session.beginTransaction();
session.save(auditLog);
session.getTransaction().commit();
}
}
catch (HibernateException e)
{
session.getTransaction().rollback();
log.error("Unable to process audit log for " + operationType + " operation", e);
}
finally
{
session.close();
}
return true;
}
}
,當然還有XML或Java中聲明CustomInterceptor
。
<property name="entityInterceptor">
<bean class="com.demo.common.CustomInterceptor"/>
</property>
我使用的春天開機。在application.properties中,spring.jpa.properties.hibernate.ejb.interceptor = AuditInterceptor。我正在使用spring jpa和sping數據。我會嘗試使用HibernateUtil的方法。但我想得到它與春季工作 – Paul
@paul我實際上在春天做它,但不是春季啓動。 – shadow
@paul在這一行做一個斷點service.add(audits.get(id));看看裏面是否有價值? – shadow