인프런 커뮤니티 질문&답변

형종님의 프로필 이미지
형종

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

기본 키 매핑

GenerationType.IDENTITY 의문점

작성

·

103

0

[질문 내용]

image.png


Long 으로 잡았을땐 db에 데이터가 들어가지는데

왜 String으로 하면 오히려 테이블이 사라지나요?

답변 2

0

안녕하세요. 형종님, 공식 서포터즈 OMG입니다.

테이블이 사라지는 경우는 다음 2가지를 확인해주세요

(1) 테이블 초기화 설정

persistence.xml의 아래 밑줄 친 value값이 create로 되어 있을까요?

create는 애플리케이션 실행 시 모든 테이블을 드랍(drop) 후 새로 생성(create) 합니다.

image.png

create로 인한 영향을 없애려면 value를 none으로 변경하면 됩니다.

none으로 변경하고 확인해주세요 😀

<property name="hibernate.hbm2ddl.auto" value="none" />

 

(2) 명시적인 롤백

해당 상황은 코드에서 예외가 발생했을 때 명시적으로 롤백이 됩니다.

image.png

이 때는 출력문을 추가하여 확인해볼 수 있습니다.(예외 발생 시 출력)

tx.rollback();
e.printStackTrace(); // 추가

 

이미 저장되어 있던 모든 데이터를 삭제하진 않겠지만, 작업 중의 변경사항은 롤백이 되어 작업 내역이 반영 되지 않을 수 있습니다.

printStackTrace();를 추가함에 따라 예외가 발생한다면 추가로 오류 메시지가 보일텐데요.

기존에 상황과 비교하여 오류메시지가 추가로 출력되는지 확인해주세요 ^^

IDENTITY의 경우 순차적으로 증가하는 '숫자' 타입의 값을 사용하기 때문에 '문자열' 타입의 String을 사용하면 IDENTITY 가 정상 적용되지 않는 걸로 알고 있습니다 😀

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

형종님께서 제시하신 문제는 @GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션과 관련하여, 프라이머리 키의 데이터 타입을 String으로 선언했을 때 발생하는 이슈로 보입니다. JPA에서 IDENTITY 전략은 주로 숫자형 데이터 타입에 대해서 자동으로 값을 증가시켜주는데, String 타입으로 선언하게 되면 해당 전략을 사용할 수 없기 때문에 오류가 발생합니다.

각 데이터베이스는 IDENTITY 값을 생성하는 데 사용할 수 있는 데이터 타입에 대해 제한을 두고 있으므로, String 타입에 IDENTITY 전략을 사용하는 것은 일반적으로 지원되지 않습니다. 이때문에 Long 타입으로 잡았을 경우에는 문제없이 작동하지만, String으로 변경하면 테이블 생성 자체에서 오류가 발생하는 것입니다.

관련 질문으로, GeneratedValue(strategy = GenerationType.IDENTITY) 변경후 실행오류 질문과 H2 database GenerationType.IDENTITY 오류 질문입니다에 제시된 해결 방법이 유사한 맥락의 문제를 다루고 있으며, 여기서도 IDENTITY 전략과 데이터 타입에 대한 꼼꼼한 설명이 있습니다. 특히, IDENTITY 전략과 호환되는 데이터 타입을 이용하는 것의 중요성을 강조합니다.

프라이머리 키의 데이터 타입을 String으로 선언하고자 할 때는 @GeneratedValue전략을 IDENTITY가 아닌 다른 전략으로 선택하거나, 이를 사용하지 않고 직접 값을 관리하는 방식을 고려해야 할 수 있습니다. 아직 이런 특정 경우를 직접 다루는 기존의 답변이 없으므로, 이러한 기본적인 원칙을 이해하는 것이 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

형종님의 프로필 이미지
형종

작성한 질문수

질문하기