如何在Struts2中实现hibernate拦截器

时间:2014-11-04 06:20:05

标签: java hibernate

在我的Struts2应用程序中,我想使用Hibernate拦截器审核所有CURD操作,请帮我解决如何实现。

2 个答案:

答案 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类中覆盖。

例如,我必须在我的审核表中存储fieldNamefieldValuefieldTypeclassName,用于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()方法