2014-05-18 3 views
9

JPA에서 낙관적 잠금을 위해 @Version으로 주석 처리 된 필드에 대해 가장 적합한 유형에 대한 의문점이 있습니다.낙관적 잠금을위한 JPA 버전 필드에 가장 적합한 유형

이 API의 자바 독 (http://docs.oracle.com/javaee/7/api/javax/persistence/Version.html)는 말한다 :

"는 다음과 같은 유형의 버전 속성에 대한 지원됩니다. INT, 정수, 짧은, 짧은, 긴, 긴,의 java.sql.Timestamp을" 다른 페이지 (http://en.wikibooks.org/wiki/Java_Persistence/Locking#Optimistic_Locking)에서

는 말한다 :..

"JPA는 필드가 숫자 또는 타임 스탬프 값이 될 수 있습니다 각 업데이트에 업데이트 될 때 낙관적 잠금 버전 필드를 사용하여 지원하는 숫자 값이 권장됩니다 숫자 값은 타임 스탬프보다 정확하고, 이식 가능하며, 성능이 뛰어나고 다루기 쉽습니다. "

"타임 스탬프 잠금은 테이블에 이미 마지막으로 업데이트 된 타임 스탬프 열이있는 경우 자주 사용되며 마지막으로 업데이트 된 열을 자동으로 업데이트하는 편리한 방법이기도합니다. 타임 스탬프 버전 값은 숫자 버전보다 유용 할 수 있습니다 객체가 마지막으로 업데이트 된 시점에 관련 정보를 포함합니다. " 내가 가진

질문은 다음과 같습니다

  • 당신이 lastUpdated 필드를해야 할 것 또는 숫자 버전 필드와 다른 필드에 타임 스탬프를 가지고하는 것이 좋습니다되는 경우 타임 스탬프 형식이 더 나은가요?

  • 숫자 형식 (int, Integer, short, short, long, Long) 중에서 선택하는 것이 가장 좋습니다 (각 유형의 길이를 고려). 내 말은, 최선은 Long이라고 생각하지만 각 행마다 많은 공간이 필요합니다.

  • 버전 필드가 마지막 숫자 숫자 (예 : 짧은 필드의 32,767)에 도달하면 어떻게됩니까? 다음 단계에서 다시 1에서 시작합니까?

답변

4

먼저, 동시 트랜잭션을 관리하는 데 잠금이 사용됨을 알아 두십시오.

1. 귀하의 우려를 분명히하십시오. lastupdated 필드가 비즈니스 모델에 특정한 경우 버전 관리 필드와 분리되어야합니다.

2. 기본 및 개체는 일반적으로 동일한 유형으로 db에 매핑됩니다. 기본적으로 부울은 nullable이고 부울은 null이 될 수 없다는 점을 제외하면 사실입니다. 그러나 null 값을 명시 적으로 적용하십시오. 이 경우 버전 필드는 null을 허용 할 수 없으므로 원시를 사용하려고합니다.

정수 또는 long이 타임 스탬프보다 좋습니다. Hibernate recommends numeric versionig 그리고 많은 공간을 차지하지 않습니다.

  1. 길게 사용하면 알지 못할 수도 있습니다.

사용하면 문제가 없습니다.

private long version; 

@Version 
public long getVersion() { 
    return version; 
} 

public void setVersion(long version) { 
    this.version = version; 
} 
3

그냥 Long 또는 Integer와 함께 사용하십시오. int 또는 long을 사용하지 마십시오. 다른 주석의 반대쪽 엔티티가 아직 지속되지 않은 경우 null 값이 필요합니다. int 또는 long을 지정하면 (자), Hibernate는, 엔티티가 벌써 보존되고 detach 상태에 있다고 생각하도록 (듯이) 해, 설정되어 있지 않은 경우, 버젼의 값은 0이됩니다. "int"가 원인 인 FK 위반을 디버깅하기 만하면되므로 시간을 절약하고 Long 또는 Integer로 이동하십시오.