티스토리 뷰

Programming/JPA

Hibernate @Version

Albothyl 2018. 7. 16. 21:42

JPA를 사용할때 특정 entity를 동시에 수정하는것을 방지해야할 경우가 있다. 

처음에는 쉬워 보이지만 이를 방지하기엔 뭔가 딱 떠오르는 좋은 수단이 애매하다.


이럴때 사용할 수 있는 기능이 Hibernate의 @Version이다. 

이 기능은 처음 객체를 조회시 Hibernate가 DB의 version field에 값을 수정하고, 값을 반환한다.

그리고 사용자가 entity를 수정후 저장할때 Hibernate는 DB의 version값과 entity가 가지고 있는 version값을 비교한다. 


일치하면 수정한 내용을 DB에 반영하고, 틀리다면 ObjectOptimisticLockingFailureException을 발생시킨다.


코드는 아래와 같다.


@Getter
@Entity
@Table(schema = "bookstore", name = "books")
@EntityListeners(AuditingEntityListener.class)
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long bookId;

private String bookName;

private String author;

private String createdBy;

private String modifiedBy;

@CreatedDate
private DateTime createdAt;

@LastModifiedDate
private DateTime modifiedAt;

@Version
private String version;
}
@Lock(LockModeType.OPTIMISTIC)
public Optional<DmpBulkWriteRequest> lockAndGetBook() {
if (isRunning()) {
Optional.empty();
}

return getBook();
}
public void modifyBook() {
try {
Optional<Book> book = bookFiner.lockAndGetBook();

if (book.isPresent()) {
...
...
}
} catch (ObjectOptimisticLockingFailureException e) {
log.error("OptimisticLockException occur");
}
}


'Programming > JPA' 카테고리의 다른 글

Embedded Mapping  (0) 2019.05.29
Discriminate Mapping  (0) 2019.05.26
Query DSL, Criteria 설정  (0) 2019.03.01
Query DSL  (0) 2018.08.05
Hibernate Criteria  (0) 2018.08.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함