[Java] JPA - id와 generatedValue 병용 불가(Hibernate 6.6ver 이상)

Hyo Kyun Lee·2025년 3월 18일
0

Java

목록 보기
90/91

1. 개요

JPA 프로젝트를 진행하면서 Hibernate가 @id와 @GeneratedValue를 병용할 수 없다는 점을 알게되어 기록한 내용이다.

2. @id와 @GeneratedValue 병용 불가

hibernate의 6.6 버전 이상부터는 id값을 명시하여 사용할 경우, generatedValue 어노테이션을 병용할 수 없다.

@id는 해당 필드변수를 PK로 설정하고, @GeneratedValue는 주키 전략에 대한 내용을 설정할 수 있는 어노테이션이다.

6.6버전 이하에서는 두 어노테이션을 병용할 수 있지만, 그 이상의 버전 부터는 병용할 수 없다.
(*Hibernate StaleObjectStateException After Upgrading to 6.6.3: Row was updated or deleted by another transaction or unsaved-value mapping was incorrect 오류 발생)

stackoveflow에서 찾아보았을때, 이로 인해 나타난 낙관적락 예외 오류 발생 상황은 아래와 같다.

  • @id 필드를 설정하였는데 해당 row가 테이블에 존재하지 않는다면 hibernate는 다른 트랜잭션에 의해 해당 row가 제거되었다는 인식을 하여 낙관락 예외 오류를 발생시킨다.
  • @id 필드를 설정하여 사용자가 해당 id값을 설정하였음에도, @GeneratedValue를 설정하여 DB에 주키생성을 위임할 경우 트랜잭션 과정이 다른 것으로 인식(주키값이 다르므로 트랜잭션 충돌로 인지)하여 낙관락 예외 오류를 발생시킨다.

따라서 6.6ver 이상부터는 이에 대한 충돌을 방지하기위해 아예 막아놓은 것으로 판단된다.

3. 참고자료

https://stackoverflow.com/questions/79274634/hibernate-staleobjectstateexception-after-upgrading-to-6-6-3-row-was-updated-or

@id, @GeneratedValue - https://velog.io/@leesomyoung/JPA-Id-Column-GeneratedValue-Entity-Table

0개의 댓글

관련 채용 정보