在我的Struts2应用程序中,我想使用Hibernate拦截器审核所有CURD操作,请帮我解决如何实现。
答案 0 :(得分:0)
您可以通过扩展EmptyInterceptor
来创建拦截器,阅读文档:
Chapter 12. Interceptors and events
该文档有一个关于如何使用拦截器实现审计的示例。
此处还有类似功能的另一个示例:Hibernate interceptor example – audit log
答案 1 :(得分:0)
您可以通过实施Interceptor或扩展XXXDAO
来创建EmptyInterceptor
类。
如果使用Interceptor
接口,则使用下面的重写方法将数据保存在单独的表中。
public boolean onLoad(Object o, Serializable srlzbl, Object[] os, String[] strings, Type[] types) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean onFlushDirty(Object o, Serializable srlzbl, Object[] os, Object[] os1, String[] strings, Type[] types) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean onSave(Object o, Serializable srlzbl, Object[] os, String[] strings, Type[] types) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void onDelete(Object o, Serializable srlzbl, Object[] os, String[] strings, Type[] types) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void onCollectionRecreate(Object o, Serializable srlzbl) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void onCollectionRemove(Object o, Serializable srlzbl) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void onCollectionUpdate(Object o, Serializable srlzbl) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void preFlush(Iterator itrtr) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void postFlush(Iterator itrtr) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public Boolean isTransient(Object o) {
throw new UnsupportedOperationException("Not supported yet.");
}
public int[] findDirty(Object o, Serializable srlzbl, Object[] os, Object[] os1, String[] strings, Type[] types) {
throw new UnsupportedOperationException("Not supported yet.");
}
public Object instantiate(String string, EntityMode em, Serializable srlzbl) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public String getEntityName(Object o) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public Object getEntity(String string, Serializable srlzbl) throws CallbackException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void afterTransactionBegin(Transaction t) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void beforeTransactionCompletion(Transaction t) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void afterTransactionCompletion(Transaction t) {
throw new UnsupportedOperationException("Not supported yet.");
}
public String onPrepareStatement(String string) {
throw new UnsupportedOperationException("Not supported yet.");
}
如果您扩展EmptyInterceptor
无需覆盖所有方法,则必需的方法可以在您的dao类中覆盖。
例如,我必须在我的审核表中存储fieldName
,fieldValue
,fieldType
,className
,用于save()
方法。
//Audit save Pojo
public class AuditSave{
private String className;
private String fieldName
private String fieldValue
private String fieldType
//setter's and getter's
}
//AuditDAO class
public class AuditDao exteds EmptyInterceptor{
public boolean onSave(Object o, Serializable srlzbl, Object[] os, String[] strings,
Type[] types) throws CallbackException {
Session session = HibernateUtil.getSessionFactory().openSesson();
String className = o.getClass().getName();
try{
Transaction tx = session.beginTransaction();
for(int i = 0;i < os.length ;i++){
AuditSave auditSave = new AuditSave();
auditSave.setClassName(className);
auditSave.setFieldName((String)strings[i]);
auditSave.setFieldValue((String)os[i]);
auditSave.setFieldType(types[i].toString());
session.save(auditSave);
tx.commit();
}catch(Exception e){
tx.rollback();
e.printStackTra;
}
if(session.isOpen())
session.close();
}
return true;
}
// same as update,delete
对于删除使用onDelete()
方法,
要使用更新,请使用findDirty()
方法