2010-02-18 9 views
4

특정 개체 유형의 변경 내용을 추적하고 차이점을 기준으로 기록 행을 기록하는 기록 구성 요소를 작성하려고합니다. 이는 하나의 객체 유형에만 적용되는 일반 감사 시스템이 아니라는 점에 유의하십시오.이벤트 호출 중에 최대 절전 모드 세션과 상호 작용

나는 최대 절전 이벤트 모델에 연결하여 상황이 바뀌었을 때 알려주는 이벤트를 듣고 내가 관심있는 개체 유형의 인스턴스에 대한 변경 사항을 감시 한 다음 일부 사용자 정의 코드에서 기록을 생성 할 수 있습니다. 행.

나는 동일한 트랜잭션에 기록 된 역사의 행을 원하고 이상적으로 내가 이벤트를 최대 절전 모드

  • 내가 후크해야 몇 가지 질문/우려, 가정 한

    (따라서 같은 세션을 사용하여) 최대 절전 모드를 사용하여 나는 단지 변화를 가두 고 싶다.

  • 이벤트를 생성하는 세션과 동일한 세션/트랜잭션에 참여하려면 어떻게해야합니까? 이벤트 핸들러 내부에서 세션과 상호 작용하는 데 문제가 있다는 것을 읽었습니까?

도움을 주시면 감사하겠습니다.

답변

2

트릭을 수행해야하는 최대 절전 엔티티 인 envers에 대한 일반 감사 솔루션이 있습니다.

그러나이 솔루션으로 충분하지 않은 경우 (사용자 의견에 나와 있듯이) org.hibernate.events 패키지는 사용 가능한 이벤트를 정의합니다. 당신의 경우 적어도 PostUpdateEventListener 인터페이스를 구현하는 것이 좋습니다.

+0

감사하지만 대상 엔터티가 변경 될 때마다 "사용자 지정"엔터티의 새 인스턴스를 만들지는 않습니다. 그것은 좋은 일반 감사 시스템처럼 보이지만 좀 더 구체적인 것을 필요로합니다. –

+0

감사합니다. PostUpdate 이벤트가 실제로 시작되었습니다. 세션/트랜잭션과 상호 작용하는 방법에 대한 좋은 정보가 있습니다. –

1

pre-insertpre-update 이벤트가 좋은 선택입니다. 이 이벤트에 대한

세션 이벤트 소스 :

귀하의 PrePersistEventPreUpdateEvent이있는 getSession() 방법이있다. 이 이벤트가 생성 된 기본 세션입니다.

그래서이 개체를 사용하여 새 개체를 만들고 동일한 세션 및 트랜잭션 내에서 유지할 수 있습니다.

+0

아니, 할 수 없습니다. 새 오브젝트는 저장하지 않습니다. –

+0

실행 트랜잭션이있는 경우 – Bozho

1

이러한 이벤트를 사용할 때는 이벤트가 발생한 세션을 만지지 마십시오. 세션을 가져 와서 세션 팩토리를 검색하고 새 세션을 엽니 다. 이것은 여전히 ​​동일한 트랜잭션에 있지만, 당신은 많은 최대 절전 모드 문제를 피할 수 있습니다.

또한 이벤트를 발생시킨 개체에서 개체 그래프를 탐색하기 시작하면 플러시 중에 모음 상태를 변경했을 때 이상한 오류가 발생할 수 있습니다. 이 "버그"에 대해 Jira 티켓이 열려 있습니다.

+0

새 세션이 동일한 데이터베이스 트랜잭션에 있는지 확인하십시오. –