복붙노트

[SPRING] 최대 절전 모드 : MyInterceptor # onFlushDirty는 호출되지 않습니다.

SPRING

최대 절전 모드 : MyInterceptor # onFlushDirty는 호출되지 않습니다.

질문 : 나의 인터셉터 # onFlushDirty가 호출 된 적이없는 이유는 무엇입니까?

나는 XML 구성에서 AbstractEntityManagerFactoryBean을 확장한다.

<bean id="myEntityManagerFactory" parent="abstractEntityManagerFactoryBean" abstract="true">
  <property name="entityInterceptor">
    <bean class="xxxx.MyInterceptor"/>
  </property>
</bean>
<bean id="abstractEntityManagerFactoryBean" class="xxxx.MyEntityManagerFactoryBean"/>

EntityManagerFactoryBean

public class MyEntityManagerFactoryBean extends AbstractEntityManagerFactoryBean implements LoadTimeWeaverAware {
  private Interceptor entityInterceptor;

  public Interceptor getEntityInterceptor() {
    return entityInterceptor;
  }

  public void setEntityInterceptor(Interceptor interceptor) {
    entityInterceptor = interceptor;
  }
}

MyInterceptor :

public class MyInterceptor extends EmptyInterceptor {

    public MyInterceptor() {
        System.out.println("init"); // Works well 
    }
    // PROBLEM - is never called
    @Override
    public boolean onFlushDirty(Object entity,
                                Serializable id,
                                Object[] currentState,
                                Object[] previousState,
                                String[] propertyNames,
                                Type[] types) {

        if (entity instanceof File) {
            .....
        }
        return false;
    }
}

업데이트 : [사용자 정의 더러운 정책이 내 방식이 아닌 것처럼 보이는 이유]

폴더 엔티티 (Folder entity EXCEPT folderPosition)에서 무언가를 변경할 때마다 업데이트 타임 스탬프를 수정하고 싶습니다. 같은 시간에 folderPosition은 지속적이고 일시적이 아니어야합니다 (즉, 엔티티가 더러워지는 것을 의미 함).

Spring Transactional과 Hibernate Templates를 사용하기 때문에 약간의 뉘앙스가 있습니다 :

1) 다음과 같이 각 세터 끝에 수정 된 타임 스탬프를 업데이트 할 수 없습니다.

public void setXXX(XXX xxx) {
  //PROBLEM: Hibernate templates collect object via setters, 
  //means simple get query will cause multiple 'modified' timestamp updates
  this.xxx = xxx;
  this.modified = new Date();
}

2) setModified는 수동으로 호출 할 수 없습니다. 약 25 개의 필드가 있고 각 필드의 setXXX가 전체 앱에 분산되어 있기 때문입니다. 그리고 리팩토링 할 힘이 없습니다.

@Entity
public class Folder {

  /**
   * GOAL: Changing of each of these fields except 'folderPosition' should cause 
   * 'modified' timestamp update
   */
  private long id;
  private String name;
  private Date created;
  private Date modified;
  private Integer folderLocation;

  @PreUpdate
  public void preUpdate() {
     //PROBLEM : change modified even if only location field has been changed!
     //PROBLEM: need to know which fields have been updated!
     modified = new Date(); 
  }   
  ....
}

해결법

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

    1.onFlushDirty가 아닌 findDirty 메소드를 확장해야합니다. GitHub 작업 예제를 참조하여 자세한 설명을 보려면이 자습서를 확인하십시오.

    onFlushDirty가 아닌 findDirty 메소드를 확장해야합니다. GitHub 작업 예제를 참조하여 자세한 설명을 보려면이 자습서를 확인하십시오.

  2. from https://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called by cc-by-sa and MIT license