1

Hibernate 4.1.0에서 제공하는 Spring 3.1/JPA 2 사용하기.Hibernate/JPA @Version 및 @Generated가 StaleObjectStateException을 야기한다.

기본 감사 기능 (타임 스탬프, 버전 번호 업데이트 등)을 제공하는 모든 엔티티에 대한 기본 클래스가 있습니다. 다른 응용 프로그램이 데이터베이스에 액세스하기 때문에 트리거를 통해 이러한 응용 프로그램을 설정해야합니다. 그리고 StaleObjectStateException 결과 -

public abstract class AbstractBaseModel implements Serializable { 

@Version 
@Generated(GenerationTime.ALWAYS) 
@Column(name = "VERSION", insertable = false, updatable = false) 
protected Long version; 

@Generated(GenerationTime.ALWAYS) 
@Column(name = "UPDATE_TIMESTAMP", insertable = false, updatable = false) 
protected Date updateDate; 
... 
} 

org.hibernate.engine.internal.increment(...) 방법은 항상 트랜잭션을 커밋 할 때 호출됩니다

내 매핑 것 같습니다.

이상하게도 버전 열에 GenerationTime.NEVER을 설정하면 최대 절전 모드로 버전이 증가하지만 제대로 유지됩니다. 문제는 데이터베이스의 버전이 업데이트되지 않더라도 (예 : 테이블 변경 없음) 병합에서 반환 된 버전이 분명히 후속 저장시 문제를 일으킬 데이터베이스 값보다 1 높습니다.

내 생각에 GenerationTime.ALWAYS은 hibernate가 버전을 증가시키지 않고 데이터베이스를 사용하여 업데이트를 시도한 다음 삽입/업데이트 한 후에 업데이트 된 값을 선택하려고 시도 할 것이라고 예상했다.

아무도 내 이해와 구현에 잘못 갔는지 말할 수 있습니까?

답변

0

본인의 실제 질문에 대한 답변이 없지만 귀하의 문제에 대한 해결책이 있습니다. : 최대 절전 모드에서

, 이렇게 완벽하게 유효합니다

@Version 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "UPDATE_TIMESTAMP" 
private Date updateDate; 

이 너무, 당신의 업데이트 최신 버전 만들 것입니다. 이것은 더 희박하고 엔터티의 모든 병합에 대해 자동으로 업데이트됩니다.

덧붙여서 : 나는 비공개로 만들고 get ters와 set을 추가하는 것이 좋습니다.

+0

아, 내 문제를 해결했으면 좋았을 텐데, 슬프게도 아니오. 이것은'@ Version'과'@ Generated '와 같은 행동을합니다. 플러시가 발생하기 전에 항상 버전을 증가시키고 Optimistic Locking Exception을 발생 시키려고 시도합니다. 필자가 원하는 것은 최대 절전 모드가 항상'@ Generated'로 표시된 필드를 증가 시키려고 시도하지 않기 위해서입니다 ... 이것이 오라클 특정 문제인지 확실하지 않지만 완전히 엉망입니다. – Ben

+0

정말 이상한 일입니다.이 코드는 몇 달 동안 프로덕션 환경에서 아무런 문제없이 실행되었습니다. 내가 너를 도울 수 없다는 것을 유감스럽게 생각하며 너의 문제를 해결할 것이라고 생각했다. – LeChe

관련 문제