Ошибка: Error creating bean with name 'entityManagerFactory' defined in class path resource
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2024-12-15T23:57:53.875+01:00 ERROR 6112 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: org.hibernate.boot.spi.MetadataBuilderInitializer: Provider org.sqlite.hibernate.dialect.SQLiteMetadataBuilderInitializer could not be instantiated at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) ~[spring-beans-6.2.0.jar:6.2.0] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-6.2.0.jar:6.2.0] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.0.jar:6.2.0] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) ~[spring-beans-6.2.0.jar:6.2.0] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) ~[spring-beans-6.2.0.jar:6.2.0] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) ~[spring-beans-6.2.0.jar:6.2.0] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) ~[spring-beans-6.2.0.jar:6.2.0] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) ~[spring-context-6.2.0.jar:6.2.0] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.0.jar:6.2.0] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.4.0.jar:3.4.0] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.4.0.jar:3.4.0] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.0.jar:3.4.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.0.jar:3.4.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.4.0.jar:3.4.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.4.0.jar:3.4.0] at com.service.auth_service.AuthServiceApplication.main(AuthServiceApplication.java:15) ~[classes/:na] Caused by: java.util.ServiceConfigurationError: org.hibernate.boot.spi.MetadataBuilderInitializer: Provider org.sqlite.hibernate.dialect.SQLiteMetadataBuilderInitializer could not be instantiated at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:582) ~[na:na] at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:809) ~[na:na] at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:725) ~[na:na] at org.hibernate.boot.registry.classloading.internal.AggregatedServiceLoader$ClassPathAndModulePathAggregatedServiceLoader.collectServiceIfNotDuplicate(AggregatedServiceLoader.java:184) ~[hibernate-core-6.3.0.Final.jar:6.3.0.Final] at org.hibernate.boot.registry.classloading.internal.AggregatedServiceLoader$ClassPathAndModulePathAggregatedServiceLoader.loadAll(AggregatedServiceLoader.java:125) ~[hibernate-core-6.3.0.Final.jar:6.3.0.Final] at org.hibernate.boot.registry.classloading.internal.AggregatedServiceLoader$ClassPathAndModulePathAggregatedServiceLoader.getAll(AggregatedServiceLoader.java:112) ~[hibernate-core-6.3.0.Final.jar:6.3.0.Final] at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.loadJavaServices(ClassLoaderServiceImpl.java:241) ~[hibernate-core-6.3.0.Final.jar:6.3.0.Final] at org.hibernate.boot.internal.MetadataBuilderImpl.(MetadataBuilderImpl.java:158) ~[hibernate-core-6.3.0.Final.jar:6.3.0.Final] at org.hibernate.boot.MetadataSources.getMetadataBuilder(MetadataSources.java:164) ~[hibernate-core-6.3.0.Final.jar:6.3.0.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.(EntityManagerFactoryBuilderImpl.java:272) ~[hibernate-core-6.3.0.Final.jar:6.3.0.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.(EntityManagerFactoryBuilderImpl.java:193) ~[hibernate-core-6.3.0.Final.jar:6.3.0.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:54) ~[spring-orm-6.2.0.jar:6.2.0] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.2.0.jar:6.2.0] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) ~[spring-orm-6.2.0.jar:6.2.0] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) ~[spring-orm-6.2.0.jar:6.2.0] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.2.0.jar:6.2.0] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) ~[spring-beans-6.2.0.jar:6.2.0] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) ~[spring-beans-6.2.0.jar:6.2.0] ... 15 common frames omitted Caused by: java.lang.NoClassDefFoundError: org/hibernate/dialect/function/SQLFunction at org.sqlite.hibernate.dialect.SQLiteMetadataBuilderInitializer.(SQLiteMetadataBuilderInitializer.java:29) ~[sqlite-dialect-0.1.1.jar:na] at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method) ~[na:na] at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1160) ~[na:na] at java.base/jdk.internal.reflect.MethodHandleAccessorFactory.ensureClassInitialized(MethodHandleAccessorFactory.java:340) ~[na:na] at java.base/jdk.internal.reflect.MethodHandleAccessorFactory.newConstructorAccessor(MethodHandleAccessorFactory.java:103) ~[na:na] at java.base/jdk.internal.reflect.ReflectionFactory.newConstructorAccessor(ReflectionFactory.java:173) ~[na:na] at java.base/java.lang.reflect.Constructor.acquireConstructorAccessor(Constructor.java:549) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[na:na] at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:785) ~[na:na] ... 31 common frames omitted Caused by: java.lang.ClassNotFoundException: org.hibernate.dialect.function.SQLFunction at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[na:na] ... 41 common frames omitted
Мой Maven:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.service</groupId>
<artifactId>auth-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>auth-service</name>
<description>auth-service</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.3.0.Final</version> <!-- Используйте версию Hibernate 6.x -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.gwenn</groupId>
<artifactId>sqlite-dialect</artifactId>
<version>0.1.1</version>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.36.0.3</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
База создается и существует, проверено:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.ResultSet;
public class DatabaseSetup {
public static void main(String[] args) {
String jdbcUrl = "jdbc:sqlite:/D:/Diplom/microservApp/auth-service/src/main/java/DB/database.db"; // Путь к файлу базы данных
try (Connection connection = DriverManager.getConnection(jdbcUrl)) {
// Создание таблицы для пользователя
String createTableSQL = "CREATE TABLE IF NOT EXISTS user ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "username TEXT NOT NULL, "
+ "password TEXT NOT NULL, "
+ "role TEXT NOT NULL);";
// Выполнение SQL запроса на создание таблицы
try (Statement statement = connection.createStatement()) {
statement.executeUpdate(createTableSQL);
}
// Добавление пользователя 'USER' с паролем и ролью
String insertUserSQL = "INSERT INTO user (username, password, role) VALUES "
+ "('USER', 'password', 'USER');"; // Создайте реальный пароль для пользователя
try (Statement statement = connection.createStatement()) {
statement.executeUpdate(insertUserSQL);
}
// Извлечение и вывод данных о пользователе
String selectUserSQL = "SELECT * FROM user WHERE username = 'USER';";
try (Statement statement = connection.createStatement(); ResultSet rs = statement.executeQuery(selectUserSQL)) {
while (rs.next()) {
// Получение данных о пользователе и вывод на экран
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String role = rs.getString("role");
System.out.println("User created: ");
System.out.println("ID: " + id);
System.out.println("Username: " + username);
System.out.println("Password: " + password);
System.out.println("Role: " + role);
}
}
System.out.println("Database and user created successfully.");
} catch (SQLException e) {
System.err.println("Database creation failed: " + e.getMessage());
}
}
}
application.properties
:
spring.datasource.url=jdbc:sqlite:/D:/Diplom/microservApp/auth-service/src/main/java/DB/database.db
spring.datasource.driverClassName=org.sqlite.JDBC
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.sqlite.hibernate.dialect.SQLiteDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.open-in-view=false
Ответы (1 шт):
В Hibernate 6, SQLite является частью Диалектов Сообщества:
Одна из областей, в которой мы действительно зависим от сообщества, — это поддержка диалектов сообщества в репозитории Hibernate. Модуль диалектов сообщества определяет совместимость с рядом старых баз данных, включая Informix, Ingres и Teradata, а также инкубирует поддержку SQLite. Эти диалекты не поддерживаются командой Hibernate, поскольку у нас нет возможности их протестировать.
Существует множество способов улучшить или расширить эти диалекты. В частности, в них обычно отсутствует поддержка расширенных или более новых функций HQL. Так что если у вас есть доступ к одной из этих баз данных, мы будем рады, если вы сможете нам помочь!
Поэтому, для установки соответствующего диалекта SQLite, нужно использовать следующие зависимости:
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-community-dialects</artifactId>
<version>6.3.0.Final</version>
</dependency>