작성
·
73
0
<property name="hibernate.hbm2ddl.auto" value="create" />
create 설정으로 해놨는데도 allocationSize 를 1에서 50으로 바꾸고 돌려봤더니
Exception in thread "main" jakarta.persistence.PersistenceException: [PersistenceUnit: hello] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1591)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1512)
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:13)
Caused by: org.hibernate.MappingException: Could not instantiate id generator [entity-name=hellojpa.Member]
at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:230)
at org.hibernate.id.factory.internal.IdentifierGeneratorUtil.createLegacyIdentifierGenerator(IdentifierGeneratorUtil.java:127)
at org.hibernate.mapping.SimpleValue.createGenerator(SimpleValue.java:415)
at org.hibernate.internal.SessionFactoryImpl.lambda$createGenerators$1(SessionFactoryImpl.java:457)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1787)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
at org.hibernate.internal.SessionFactoryImpl.createGenerators(SessionFactoryImpl.java:456)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:271)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:450)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1507)
... 4 more
Caused by: org.hibernate.MappingException: The increment size of the [MEMBER_SEQ] sequence is set to [50] in the entity mapping while the associated database sequence increment size is [1].
at org.hibernate.id.enhanced.SequenceStyleGenerator.adjustIncrementSize(SequenceStyleGenerator.java:265)
at org.hibernate.id.enhanced.SequenceStyleGenerator.configure(SequenceStyleGenerator.java:207)
at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:224)
... 20 more
이런 오류들이 떴고 확인해보니 하이버네이트에서 정의된 시퀀스의 증가수 크기와 h2 DB의 증가수가 달라서 생긴 오류인 것 같아 DB에 따로 쿼리를 날려주고 실행해보니 정상 작동되더라구요.
ALTER SEQUENCE MEMBER_SEQ INCREMENT BY 50;
이렇게 사이즈 변경 시, DB에서 수동으로 쿼리를 날려줘야하나요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
질문하신 “시퀀스 최적화 할 때 DB에서 따로 시퀀스를 수정하는 쿼리를 날려줘야 하나요?“에 대한 답변으로, allocationSize
를 변경할 때 데이터베이스 상의 시퀀스 증가 크기도 함께 변경해야 한다는 점을 확인하셨네요. hibernate.hbm2ddl.auto
설정이 create
일 경우, 애플리케이션 실행 시 시퀀스를 포함한 스키마를 자동으로 생성해주지만, 기존에 존재하는 시퀀스의 증분 크기를 변경하지는 않습니다. 따라서, JPA 엔티티에 설정된 allocationSize
와 데이터베이스 시퀀스의 증분 크기 사이에 불일치가 발생하면 오류가 발생할 수 있습니다.
유사한 문제로, 에러 메시지와 같이 “The increment size of the [시퀀스 이름] sequence is set to [JPA에서 설정한 값] in the entity mapping while the associated database sequence increment size is [데이터베이스 실제 값].“가 출력되는 경우가 있습니다. 이럴 때는 데이터베이스에서 직접 시퀀스의 증분 크기를 조정해주어야 합니다.
여기에 해당하는 유사한 질문과 답변을 참고하시면 도움이 될 것 같습니다:
allocationSize
값과 데이터베이스의 시퀀스 증가 크기와의 불일치로 인해 발생하는 문제와 그 해결 방법에 대한 설명이 있습니다. 이 질문에서 지식공유자는 직접 데이터베이스 명령을 사용하여 시퀀스를 삭제한 후 새로운 증가 크기로 다시 생성할 것을 조언합니다.이 정보를 바탕으로, allocationSize
의 변경이 필요할 경우, 반드시 데이터베이스의 시퀀스 설정도 확인하고 필요에 따라 적절한 변경을 직접 적용해야 함을 알 수 있습니다. Hibernate와 같은 JPA 구현체를 사용하면 많은 절차를 자동화할 수 있지만, 일부 설정 변경의 경우에는 데이터베이스에 직접적인 조치가 요구될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.