작성
·
551
1
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
GeneratedValue 를 도입하고 나서부터 문제가 발생했습니다... GeneratedValue를 도입하지 않으면 잘 작동되지만 String key를 변경하고나서 부터 ERROR: Table "MEMBER" not found; SQL statement:
/* insert hellojpa.Member */ insert into Member (id, name) values (null, ?) [42102-200]
해당 오류가 자꾸 뜹니다... 그래서 테이블에 저장이 안되요...
하이버네이트 버전문제인건가요??
create table이됐는데도 생성이 안되는건 커밋이 될때 null이 들어가서 생성이 안되는건가요??
전채적으로 어떻게 고쳐야할까요?
답변 1
4
안녕하세요.
일단 원인은 String 타입 (데이터 베이스에서는 varchar 타입)의 ID를 IDENTITY 전략으로 자동 생성할 수 없기 때문입니다. (에러 메세지 중 Feature not supported: "CHARACTER VARYING(255)" -> 기능이 varchar(255)를 지원하지 않는다는 뜻입니다.)
1. 하이버네이트의 버전 문제는 아닌 것 같습니다.
2. 로그에서 create 쿼리가 찍혔다고 해서 해당 쿼리가 정상적으로 수행됐다는 것을 의미하지는 않습니다. 쿼리를 데이터베이스에 전달했으나 데이터베이스가 정상적으로 수행하지 못하고 오류를 뱉었습니다.
제가 1.4.199, 1.4.200, 2.2.244 세가지 버전의 h2 데이터베이스로 테스트 해보니..
1.4.199, 1.4.200 버전의 h2 데이터베이스에서는 데이터 타입이 String(varchar)이어도 IDENTITY 전략으로 ID를 자동 생성할 수 있었습니다.
반면 2.2.244 버전의 h2 데이터베이스에서는 데이터 타입을 반드시 int와 같은 숫자형으로만 자동 생성할 수 있었습니다.
제 생각에는 문자형의 데이터 타입이 자동으로 증가되는 것이 부적절하다고 판단하여 2 버전부터는 숫자형 데이터 타입으로만 IDENTITY 조건을 걸 수 있도록 한 것 같습니다. h2database.com이나 github에서 관련 내용을 찾아보려고 했는데 못 찾겠네요.
+인프런에 동일한 질문이 있었기에 남겨드립니다.
https://www.inflearn.com/questions/382601/generatedvalue-%EC%82%AC%EC%9A%A9-%ED%9B%84-ddl-%EC%8B%A4%ED%8C%A8
H2 콘솔에서 h2 db의 버전 확인 방법입니다.
혹은 파일명으로도 확인하실 수 있습니다.