작성
·
237
1
[질문 내용]
기본 키 매핑 4분 10초 쯤에 id 필드에 @GeneratedValue() 어노테이션의 기본전략을 IDENTITY로 바꾸시고 실행을 하였을 때 김영한 강사님께서는 id 필드의 타입이 String이었습니다. 그런데 에러없이 잘 실행되더라고요. 그래서 저도 같은 코드에 실행을 하였을때는 에러가 나오고 아래에 콘솔에 나온 로그처럼 DDL이 실행이 에러난다고 표시가 나서 해결법을 찾는 과정에서 String타입을 Long타입으로 고치니 다시 재실행하였을 때 문제없이 DB에 잘 반영이 되었습니다. 어떤 차이로 이렇게 결과가 다른건지 궁금합니다.
WARN: GenerationTarget encountered exception accepting command : Error executing DDL "
create table Member (
id varchar(255) generated by default as identity,
name varchar(255) not null,
primary key (id)
)" via JDBC [Feature not supported: "CHARACTER VARYING(255)";]
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
create table Member (
id varchar(255) generated by default as identity,
name varchar(255) not null,
primary key (id)
)" via JDBC [Feature not supported: "CHARACTER VARYING(255)";]
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:94)
at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233)
at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createTables(SchemaCreatorImpl.java:420)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createSequencesTablesConstraints(SchemaCreatorImpl.java:340)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:239)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:172)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:142)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:118)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:256)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:145)
at java.base/java.util.HashMap.forEach(HashMap.java:1421)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:142)
at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37)
at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:315)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:450)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1507)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:55)
at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:80)
at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at hellojpa.JpaMain.main(JpaMain.java:10)
Caused by: org.h2.jdbc.JdbcSQLFeatureNotSupportedException: Feature not supported: "CHARACTER VARYING(255)"; SQL statement:
create table Member (
id varchar(255) generated by default as identity,
name varchar(255) not null,
[50100-232]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:568)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.message.DbException.getUnsupportedException(DbException.java:287)
at org.h2.command.ddl.SequenceOptions.getBounds(SequenceOptions.java:316)
at org.h2.command.ddl.SequenceOptions.getBounds(SequenceOptions.java:244)
at org.h2.schema.Sequence.<init>(Sequence.java:100)
at org.h2.table.Column.initializeSequence(Column.java:502)
at org.h2.command.ddl.CommandWithColumns.generateSequences(CommandWithColumns.java:103)
at org.h2.command.ddl.CreateTable.update(CreateTable.java:113)
at org.h2.command.CommandContainer.update(CommandContainer.java:139)
at org.h2.command.Command.executeUpdate(Command.java:304)
at org.h2.command.Command.executeUpdate(Command.java:248)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:386)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:193)
at java.base/java.lang.Thread.run(Thread.java:842)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:568)
at org.h2.engine.SessionRemote.readException(SessionRemote.java:650)
at org.h2.engine.SessionRemote.done(SessionRemote.java:619)
at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:262)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:231)
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:80)
... 21 more
답변 2
1
안녕하세요, 인프런 AI 인턴입니다.
soojinkimss님께서 직면하신 문제는 @GeneratedValue(strategy = GenerationType.IDENTITY)
을 사용하려고 할 때 발생하는 일반적인 문제 중 하나입니다. 여기서 핵심 문제는 IDENTITY
전략을 사용할 때 ID 필드의 데이터 타입과 데이터베이스가 사용하는 DDL(데이터 정의 언어) 사이의 호환성 문제입니다.
김영한 강사님께서는 수업과정에서 ID 필드의 타입을 String
으로 유지하면서도 성공적으로 실행하셨을 수도 있지만, 일반적으로 IDENTITY
전략은 서 수를 증가시키는 방식으로 작동하므로 Long
이나 Integer
와 같은 숫자형 데이터 타입과 가장 잘 맞습니다. 이는 데이터베이스가 기본 키를 자동으로 생성해야 하는 상황에서 VARCHAR과 같은 문자형이 부적합할 수 있음을 의미합니다.
아래는 비슷한 오류 및 해결 방법에 대한 링크입니다:
- H2 database GenerationType.IDENTITY 오류 질문입니다.
이 링크에서는 H2 데이터베이스
의 버전 호환성 문제나 설정 문제로 인해 IDENTITY
전략이 제대로 작동하지 않는 경우에 대한 해결 방법을 제공합니다. 주로 데이터베이스 설정이나 드라이버의 버전을 조정하는 방법으로 해결할 수 있습니다. 예를 들어, application.properties
에서 spring.datasource.url
에 특정 모드 옵션을 추가하거나, 데이터베이스 드라이버의 버전을 변경하여 호환성을 확보하는 방법이 있습니다.
결론적으로, @GeneratedValue(strategy = GenerationType.IDENTITY)
를 사용하면서 ID 필드를 String
으로 설정하면 특정 데이터베이스 환경에서는 호환성 문제가 발생할 수 있으며, 이를 해결하기 위해 Long
과 같은 숫자형 타입을 사용하는 것이 일반적입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
강사님은 Hibernate 5.x 이하 버전을 사용했기 때문에, @Id 필드를 String으로 설정하고도 @GeneratedValue(strategy = GenerationType.IDENTITY)를 사용할 수 있었던 것으로 보임. Hibernate 5.x는 DDL 생성 시 'varchar'를 사용하므로 H2 1.4.x와 호환되어 문제가 발생하지 않음.
하지만 Hibernate 6.x부터는 DDL에서 'character varying'을 사용하고, H2 2.x는 해당 타입을 지원하지 않아 테이블 생성 자체가 실패함. 따라서 Hibernate 6.x + H2 2.x 조합에서는 id 필드를 숫자(Long) 타입으로 지정하거나, UUID 방식으로 수동 생성해야 함.
챗GPT 가 이렇게 답변해줬어요. 참고해주세요
너무 감사합니다~^ㅇ^