2012-10-03 131 views
1

我正在使用hibernate事件侦听器实现一个简单的审计日志功能。我想积累交易中所有实体的所有更改并处理审计。Hibernate事件侦听器 - postFlush等效

通过使用Hibernate拦截器的方法,我们有postFlush(),我们处理所有的累积审计事件的审计。

什么是事件监听器的等价物?

我尝试使用 'hibernate.ejb.event.flush' 事件。但它甚至在onPostInsert,onPostUpdate和onPostDelete事件之前调用生命周期的开始。所以不能积累变化。

也尝试自动刷新,它也没有工作。任何想法?

回答

1

就不要误导别人标注实体一样简单,我理解了它的洗净事件侦听器的实际工作。问题是默认的hibernate事件监听器没有注册。当我将默认事件侦听器与自定义侦听器一起注册时,它开始正常工作。

+0

是的!为我工作... –

+0

不幸的是,在我的情况下,flushEventListener在postUpdate,postInsert和postDelete监听器之前被调用,所以它不是在Hibernate拦截器上的postFlush equivevelent。 –

0

如果要实现与Hibernate的审计,我会建议你使用Envers。审计与Envers是与@Audited注释

+0

是啊,我看着envers。我的简单要求有点沉重。此外,我不想为每个实体,版本等的表。谢谢 –

0

我审核通过这种方式,但日期是丑..

的persistence.xml

<property name="hibernate.ejb.interceptor" value="siapen.jpa.interceptor.MeuInterceptador" /> 

Java代码

import java.io.Serializable; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Iterator; 

import org.apache.commons.lang3.ObjectUtils; 
import org.hibernate.CallbackException; 
import org.hibernate.EmptyInterceptor; 
import org.hibernate.type.Type; 

import siapen.model.BaseEntity; 

public class MeuInterceptador extends EmptyInterceptor { 

    private static final long serialVersionUID = 7853236444153436270L; 

    private String strSQL = ""; 
    String acao; 
    @SuppressWarnings("rawtypes") 
    BaseEntity entity; 
    String s = ""; 

    @SuppressWarnings("unchecked") 
    // 1 
    public boolean onSave(Object obj, Serializable id, Object[] valores, String[] propertyNames, Type[] types) 
      throws CallbackException { 
     if (obj instanceof BaseEntity) { 
      entity = (BaseEntity) obj; 
      for (int i = 0; i < valores.length; i++) { 
       if (valores[i] != null && !valores[i].equals("")) { 
        s += propertyNames[i] + ":" + valores[i]; 
        if (i != valores.length - 1) { 
         s += "___"; 
        } 
       } 
      } 
     } 
     return false; 
    } 

    @SuppressWarnings("unchecked") 
    // 1 
    public boolean onFlushDirty(Object obj, Serializable id, Object[] valoresAtuais, Object[] valoresAnteriores, 
      String[] propertyNames, Type[] types) throws CallbackException { 
     if (obj instanceof BaseEntity) { 
      entity = (BaseEntity) obj; 

      for (int i = 0; i < valoresAtuais.length; i++) { 

       if (!ObjectUtils.equals(valoresAtuais[i], valoresAnteriores[i])) { 
        if (!s.equals("")) { 
         s += "___"; 
        } 
        s += propertyNames[i] + "-Anterior:" + valoresAnteriores[i] + ">>>Novo:" + valoresAtuais[i]; 
       } 
      } 
     } 
     return false; 

    } 

    @SuppressWarnings("unchecked") 
    // 1 
    public void onDelete(Object obj, Serializable id, Object[] state, String[] propertyNames, Type[] types) { 
     if (obj instanceof BaseEntity) { 
      entity = (BaseEntity) obj; 
     } 
    } 

    // CHAMADO ANTES DO COMMIT 
    // 2 
    @SuppressWarnings("rawtypes") 
    public void preFlush(Iterator iterator) { 
    } 

    // 3 
    public String onPrepareStatement(String sql) { 
     acao = ""; 
     if (sql.startsWith("/* update")) { 
      acao = "update"; 
     } else if (sql.startsWith("/* insert")) { 
      acao = "insert"; 
     } else if (sql.startsWith("/* delete")) { 
      acao = "delete"; 
     } 
     if (acao != null) { 
      strSQL = sql; 
     } 
     return sql; 
    } 

    // CHAMADO APÓS O COMMIT 
    // 4 
    @SuppressWarnings("rawtypes") 
    public void postFlush(Iterator iterator) { 
     if (acao != null) { 
      try { 
       if (acao.equals("insert")) { 
        AuditLogUtil audi = new AuditLogUtil(); 
        audi.LogIt("Salvo", entity, s); 
       } 
       if (acao.equals("update")) { 
        AuditLogUtil audi = new AuditLogUtil(); 
        audi.LogIt("Atualizado", entity, s); 
       } 
       if (acao.equals("delete")) { 
        AuditLogUtil audi = new AuditLogUtil(); 
        audi.LogIt("Deletado", entity, ""); 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       strSQL = ""; 
       s = ""; 
      } 
     } 
    } 

}