본문 바로가기
🪲 bugs

Error: Sqlite3 와 Hibernate 연동 문제

by iirin 2023. 11. 18.

발생 상황

간단한 토이 프로젝트 세팅 중, DB를 무엇으로 쓸 지 정해지지 않은 상태에서 가볍게 SQLite를 써보자고 하는 중이었는데요.

(SQLite는 단일 파일 DB로서 h2와 경량화된 데이터베이스이며 인메모리로 활성화할 수 있다는 공통점이 있습니다. 학습의 용도로 SQLite를 시도해보기로했어요.)

 

SQLite와 Spring JPA가 연동되지 않는 문제가 있었습니다.

 

  • 당시 yml
spring:
  datasource:
    driver-class-name: org.sqlite.JDBC
    url: jdbc:sqlite:sqlite-sample.db
  jpa:
    database-platform: org.hibernate.community.dialect.SQLiteDialect
  • 에러메시지
org.hibernate.HibernateException: Unable to determine Dialect for SQLite 3.43 (please set 'hibernate.dialect' or register a Dialect resolver)
	at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:202) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:86) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$1.execute(JdbcEnvironmentInitiator.java:358) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$1.execute(JdbcEnvironmentInitiator.java:280) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.jdbc.WorkExecutor.executeReturningWork(WorkExecutor.java:56) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.jdbc.AbstractReturningWork.accept(AbstractReturningWork.java:34) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:70) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:279) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:193) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:69) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:119) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:264) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:239) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:216) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.boot.model.relational.Database.<init>(Database.java:45) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:231) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:199) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:169) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1383) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1454) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final]

 

발생 원인

JPA와 DB가 연동 되려면 Dialect가 필요한데 기존에 지원하던 SQLite용 Dialect가 Hibernate 6 에서는 더이상 지원하지 않았기 때문입니다.

👉 Dialect 패키지에 대한 참고링크 : https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/dialect/package-summary.html

 

org.hibernate.dialect (Hibernate JavaDocs)

Package org.hibernate.dialect Description This package abstracts the SQL dialect of the underlying database. A concrete Dialect may be specifed using hibernate.dialect.

docs.jboss.org

 

 

대처

hibernate-community-dialects 의존성을 build.gradle 에 추가해주었습니다.

    implementation 'org.xerial:sqlite-jdbc:3.43.2.2'
    implementation('org.hibernate.orm:hibernate-community-dialects:6.1.7.Final') // 이부분을 추가해 주었습니다.

 


Refs.