エンティティ更新のための監査を行いたいと思います。だから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;
}
削除レコードの挿入と更新私たちは作成され更新されたユーザーを使用できますが、削除では誰がレコードを削除するのかわかりません –