2011-05-13 2 views
2

낙천적 동시성 제어를 구현하기 위해 버전 열과 함께 최대 절전 모드를 사용하고 있습니다.더티인지 아닌지에 관계없이 Hibernate에서 저장시 버전 필드를 늘리는 방법은 무엇입니까?

질문 : 변경 여부와 관계없이 데이터베이스에 저장할 때마다 엔티티의 버전 번호를 증가시킬 수 있습니까?

엔터티에서 일부 필드가 변경되면 버전 번호가 증가합니다. 그러나 엔티티에서 필드가 변경되지 않으면 엔티티의 버전 번호는 변경되지 않습니다.

이 질문의 이유는 두 테이블 사이에 논리적 인 마스터 - 세부 관계가 있고 마스터 데이터가 세부 사항이 변경 될 때마다 마스터 테이블의 버전 번호를 늘리고 싶습니다. 변화. 이 마스터 - 세부 관계는 Hibernate에 매핑되지 않는다. 나는 항상 그것들을 하나의 트랜잭션으로 저장한다.

+0

인터셉터를 사용하여 버전 업데이트를 트리거 한 적이 있습니까? – Fil

+0

아직 인터셉터를 다루지 않았습니다. 모범이 있습니까? 필자가 이해하는 한 * findDirty (...) * 함수를 덮어 쓰면 엔티티를 더티라고 표시하는 것으로 충분할 수 있습니다. – MicSim

+0

나는 주로 감사 용도로 사용했지만, 다양한 이벤트 (예 : postFlush, postFlushDirty 등) 후에 엔티티에 액세스 권한을 부여합니다. 세부 정보가 플러시되면 마스터의 버전 번호를 업데이트하는 두 번째 호출을 가질 수 있습니다. – Fil

답변

2

세부 정보가 변경된 것으로 확인되면 최대 절전 모드 인터셉터를 사용하여 마스터 레코드의 버전 번호를 업데이트 할 수 있습니다.

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/events.html

한 제한이 솔루션은 절전 모드에 특정이다. 또한 JPA는 주석 (예 : PostPersist, PostUpdate 등)을 사용하여 이벤트 기반 논리를 허용하지만 이러한 메서드는 기본 세션에 대한 액세스를 제공하지 않습니다. 더 중요한 것은 문서에서 세션을 수정하기 위해 이러한 메서드를 사용하지 않도록주의해야합니다. 데이터). 필자는 일반적으로 인터셉터를 사용하여 감사를 수행했지만 기록이 변경되면 쉽게 버전 번호를 업데이트 할 수 있습니다.

0

lock() (또는 다른 방법으로는 LockMode)을 LockMode.OPTIMISTIC_FORCE_INCREMENT으로 호출 할 수 있습니다.

+0

이 문제에 대한 공개 된 문제가 있지만 (http://opensource.atlassian.com/projects/hibernate/browse/HHH-5222 및 수정 될 예정인 이전 버전 인 5032 참조), 그럼에도 불구하고이를 점검 할 것입니다. – MicSim

+0

귀하의 제안을 확인했지만, 불행히도 위의 JIRA 문제에서 언급 한 것과 같은 버그로 인해 작동하지 않습니다. – MicSim

관련 문제