하이버네이트, 데이터 변경 이력 남기기

입력/수정/삭제에 대해  히스토리을 남기고 싶다.
 - 속성, 이전값, 변경값

https://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/Interceptor.html
간단히 EmptyInterceptor를 오버라이드해서 쓰면 된다.

[설정, hibernate 4.2는 이렇고 3.x는 설정이 다르다. 인터셉터 구현 패턴의 변경]

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="entityInterceptor" ref="historyInterceptor"/>

1. 입력
onSave(...)

2. 수정
onFlushDirty(...)

3. 삭제
onDelete(...)

4. 컬렉션 입력/수정/삭제
onCollectionRecreate(...), onCollectionUpdate(...), onCollectionRemove(...)

5. 기타 등등 많이 있음.



이상한점 1
객체가 컬렉션일때(OneToMany) 그 객체들을 삭제하려면?
1. Set.remove(o)를 하면 삭제가 안된다. 왜 안되는지 모르겠다.
2. Set.removeAll(..) 을 해야 삭제가 된다. 그런데 Set 전체를 삭제해야 한다. 일부만 삭제하면 삭제가 안된다. 이건 뭥미??
3. 위와 같은 경우에 인터셉터에 걸리지 않는다. 삭제가 안되었으니까 ..



이상한점 2
afterTransactionBegin(), afterTransactionCompletion(), beforeTransactionCompletion() 얘네들은 도대체 언제 호출되는거야?
기존 객체를 업데이트할때는 생각데로 호출되는거 같다. 그런데 입력/삭제일때는? 좀 이상하다. afterTransactionCompletion() 이후에 onSave()?? 삽질하다가 포기함




댓글

이 블로그의 인기 게시물

미적분과 차원

자바 로깅

apache rewrite_module 로그