2017-08-09 7 views
1

エンティティ更新のための監査を行いたいと思います。だからEmptyInterceptorを実装しました。
マイonFlushDirty()方法で実行されていませんが、afterTransactionCompletion()はありません、私は春4.1を使用して、私は@Componentではなく、任意の設定を行っていない5.0
+
休止していHibernate EmptyInterceptor onFlushDirty()が実行されていません

を実行しますafterTransactionCompletion()が実行されるまで、コンフィギュレーションファイル内のが実行されます。

ここに何がありますか?
イベントquery.executeUpdate()をインターセプトする方法もありますか?

次のように私のインターセプタクラスは次のとおりです。

@Component 
public class AuditLogInterceptor extends EmptyInterceptor { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public boolean onFlushDirty(Object entity, Serializable id, 
      Object[] currentState, Object[] previousState, 
      String[] propertyNames, Type[] types) { 
     System.out.println("AuditLogInterceptor.onFlushDirty()"); 
     System.out.println(); 
     System.out.println("Property Names :- "); 
     for (String propertyName : propertyNames) { 
      System.out.print(", "+propertyName); 
     } 
     System.out.println(); 
     System.out.println("Current State :- "); 
     for (Object current : currentState) { 
      System.out.print(", "+ String.valueOf(current)); 
     } 
     System.out.println(); 
     System.out.println("Previous State :- "); 
     for (Object previous : previousState) { 
      System.out.print(", "+ String.valueOf(previous)); 
     } 
     return true; 
     //return super.onFlushDirty(entity, id, currentState, previousState, 
       //propertyNames, types); 
    } 
    @Override 
    public void afterTransactionCompletion(Transaction tx) { 
     // TODO Auto-generated method stub 
     System.out.println("AuditLogInterceptor.afterTransactionCompletion()"); 
     super.afterTransactionCompletion(tx); 
    } 
    @Override 
    public boolean onSave(Object entity, Serializable id, Object[] state, 
      String[] propertyNames, Type[] types) { 
     System.out.println("AuditLogInterceptor.onSave()"); 
     System.out.println("Property Names :- "+Arrays.toString(propertyNames)); 
     System.out.println("States :- "+Arrays.toString(state)); 
     return super.onSave(entity, id, state, propertyNames, types); 
    } 
    @Override 
    public void postFlush(@SuppressWarnings("rawtypes") Iterator entities) { 
     System.out.println(); 
     System.out.println("AuditLogInterceptor.postFlush()"); 
     for (; entities.hasNext() ;) { 
      System.out.println("-----"+ entities.next().getClass().getSimpleName()); 
     } 
     System.out.println(); 
     super.postFlush(entities); 
    } 
} 

コード私のDAOで

@Override 
public boolean updateAssignment(Integer workTaskDetailId, short workTaskStatus) { 
    Session session = null; 
    Transaction transaction = null; 
    boolean isUpdated = false; 
    try { 
     session = this.sessionFactory.withOptions().interceptor(new AuditLogInterceptor()).openSession(); 
     transaction = session.beginTransaction(); 
     String COMPLETION_DATE = ""; 
     if(workTaskStatus == 263) 
      COMPLETION_DATE = ", wtd.completionDate = :completionDate "; 
     final String UPDATE_WORKTASKSTATUS = "update WorkTaskDetail wtd set wtd.workTaskStatus = :workTaskStatus " 
              +COMPLETION_DATE+ "where wtd.workTaskDetailId = :workTaskDetailId "; 
     Query query = session.createQuery(UPDATE_WORKTASKSTATUS).setShort("workTaskStatus", workTaskStatus) 
       .setInteger("workTaskDetailId", workTaskDetailId); 
     if(workTaskStatus == 263) 
      query.setDate("completionDate", new Date()); 
     int updateCount = query.executeUpdate(); 
     if(updateCount > 0) 
      isUpdated = true; 
     if(session != null) 
      session.flush(); 
     if(transaction != null && transaction.getStatus().equals(TransactionStatus.ACTIVE)) 
      transaction.commit(); 
    } catch (Exception exception) { 
     if(transaction != null && transaction.getStatus().equals(TransactionStatus.ACTIVE)) 
      transaction.rollback(); 
     LOGGER.error("Message  :- "+exception.getMessage()); 
     LOGGER.error("Root Cause :- "+exception.getCause()); 
     LOGGER.error("     ************************************************************"); 
    } finally { 
     if(session != null) 
      session.close(); 
    } 
    return isUpdated; 
} 

答えて

1

現在実行中の永続コンテキストによって変更されて何の実体がなかったので、onFlushDirtyメソッドが呼び出されませんでした。

I explained in this articleとして、管理対象エンティティのみが自動UPDATE文を生成できます。あなたの場合、手動のSQL UPDATEを実行していますが、これはHibernate entity state transitionsの範囲を超えています。休止状態の上に自家製の監査ログを書き込む必要がないよう

  1. 使用Hibernate Envers

    したがって、2つの選択肢があります。

  2. Debeziumを使用してください.DBにはすでに監査ログがあります(a.k.a. WAL、REDOログ、トランザクションログ)。
+0

削除レコードの挿入と更新私たちは作成され更新されたユーザーを使用できますが、削除では誰がレコードを削除するのかわかりません –

関連する問題