복붙노트

[SPRING] 감사 추적 테이블을 만들기 위해 최대 절전 모드 인터셉터를 사용하여 db에서 페치하지 않고 previouseState를 얻는 방법?

SPRING

감사 추적 테이블을 만들기 위해 최대 절전 모드 인터셉터를 사용하여 db에서 페치하지 않고 previouseState를 얻는 방법?

나는 그런 식으로 끝나는 감사 테이블을 만들려고합니다.

최대 절전 모드 EmptyInterceptor 사용 나는이 테이블이 많은 IO를 가질 것이라고 기대한다. onFlushDirty 메서드에서 previouseState가 예상대로 작동하지 않는 것 같습니다.

여기에 표시된대로 db에서 페치하지 않고 어떻게 이전 값을 가져올 수 있습니까?

나는이 지위를 따라 가려고했다.

public class AuditLogInterceptor extends EmptyInterceptor {
    private Set inserts    = new HashSet();
    private Set updates    = new HashSet();
    private Set deletes    = new HashSet();
    private Map oldies     = new HashMap();

    @Override
    public boolean onSave(Object entity,
                          Serializable id,
                          Object[] state,
                          String[] propertyNames,
                          Type[] types)
            throws CallbackException {
        if (entity instanceof Auditable)
            inserts.add((Auditable)entity);
        return false;
    }

    @Override
    public void onDelete(Object entity, Serializable id, Object[] state,
            String[] propertyNames, Type[] types) {
        if (entity instanceof Auditable)
            deletes.add((Auditable)entity);
    }

    @Override
    public boolean onFlushDirty(Object entity,
                                Serializable id,
                                Object[] currentState,
                                Object[] previousState,
                                String[] propertyNames,
                                Type[] types)
            throws CallbackException {
        if (entity instanceof Auditable) {
            try {
                // Use the id and class to get the pre-update state from the database
                Session tempSession =
                    HibernateUtil.getSessionFactory().openSession();
                Auditable old = (Auditable) tempSession.get(entity.getClass(), ((Auditable) entity).getId());
                oldies.put(old.getId(), old);
                updates.add((Auditable)entity);
            } catch (Throwable e) {
                _log.error(e,e);
            }
        }
        return false;
    }

db에 왕복하지 않고 사전 업데이트 상태를 얻는 방법이 있습니까?

해결법

  1. ==============================

    1.다른 방법은 이전 상태를로드에 저장하는 것입니다.

    다른 방법은 이전 상태를로드에 저장하는 것입니다.

    @Entity
    @Table(name='Foo')
    class Foo {
    
        @Transient
        private Foo previousState;
    
        @PostLoad
        private void setPreviousState(){
            previousState = new Foo();
            //copy the fields
        }
    
        public Foo getPreviousState(){
            return previousState;
        }
    
    }
    
  2. from https://stackoverflow.com/questions/27529208/how-to-get-previousestate-without-fetching-from-the-db-using-hibernate-intercept by cc-by-sa and MIT license