[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.onFlushDirty가 아닌 findDirty 메소드를 확장해야합니다. GitHub 작업 예제를 참조하여 자세한 설명을 보려면이 자습서를 확인하십시오.
onFlushDirty가 아닌 findDirty 메소드를 확장해야합니다. GitHub 작업 예제를 참조하여 자세한 설명을 보려면이 자습서를 확인하십시오.
from https://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 3.0에 포함시킬 maven 종속성은 무엇입니까? (0) | 2018.12.13 |
---|---|
[SPRING] Spring Data JPA의 CrudRepository와 JpaRepository 인터페이스의 차이점은 무엇입니까? (0) | 2018.12.13 |
[SPRING] Eclipse와 같은 진행 표시 줄로 스플래시 화면 만들기 (0) | 2018.12.13 |
[SPRING] Spring-MongoDb 집계 프레임 워크에서 $ cond 연산을 사용하는 방법 (0) | 2018.12.13 |
[SPRING] Mongodb 중첩 된 배열 내부의 값 증가 (0) | 2018.12.13 |