我在运行 springboot 应用程序时遇到此错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: UUID
我尝试解决此问题,但我只找到描述类似问题的页面,但“调用 init 方法失败”而不是“UUID”。
当出现“在类路径资源中定义的名称为“entityManagerFactory”的创建 bean 时出错”错误消息时,找不到“UUID”:/
chatGPT 告诉我: “您遇到的 org.springframework.beans.factory.BeanCreationException 消息“创建名称为“entityManagerFactory”的 bean 时出错”通常表示EntityManagerFactory bean 的配置存在问题,该 bean 负责管理 JPA(Java Persistence) Spring Boot 应用程序中的 API)实体管理器。
错误消息包含对 HibernateJpaConfiguration.class 和术语“UUID”的引用。这表明您正在使用的库的版本可能不匹配,尤其是与 Hibernate 相关的库。”
这很有意义,但是我已经仔细检查了 Maven 存储库上的所有兼容性,看起来我是最新的。 这是我的 pom.xml:
<?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.1.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.globomatics</groupId>
<artifactId>bike</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>bike</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
<spring.boot.version>3.1.3</spring.boot.version>
</properties>
<dependencies>
<!-- Other dependencies -->
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- SQLite Driver -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.42.0.0</version>
</dependency>
<!-- Hibernate-->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.2.7.Final</version>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Spring Boot Maven Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
此外,我无法理解这个“错误创建名称为'entityManagerFactory'的bean”,因为我使用的是spring data jpa存储库,并且在这种情况下我不必配置entityManagerFactory或数据源。
这也是我的application.properties
spring.jpa.database-platform=org.hibernate.dialect.SQLiteDialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.datasource.url=jdbc:sqlite:bike.db
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.sqlite.JDBC
还有一些关于我的注释的信息应该是正确的:
@SpringBootApplication
@EntityScan("com.globomatics.bike.models")
@EnableJpaRepositories("com.globomatics.bike.repositories")
public class BikeApplication {
public static void main(String[] args) {
SpringApplication.run(BikeApplication.class, args);
}
}
@RestController
@RequestMapping("/api/v1/bikes")
public class BikeController {
private final BikeRepository bikeRepository;
@Autowired
public BikeController(BikeRepository bikeRepository) {
this.bikeRepository = bikeRepository;
}
@GetMapping
public List<Bike> list() {
return bikeRepository.findAll();
}
@PostMapping
@ResponseStatus(HttpStatus.OK)
public void create(@RequestBody Bike bike){
bikeRepository.save(bike);
}
@GetMapping("/{id}")
public Bike get(@PathVariable("id") long id){
return bikeRepository.getReferenceById(id);
}
}
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Bike {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String email;
private String phone;
private String model;
private String serialNumber;
private BigDecimal purchasePrice;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "MM-dd-yyyy")
private Date purchaseDate;
private boolean contact;
// GETTERS AND SETTERS
}
最后,标准 JPA 存储库接口:
public interface BikeRepository extends JpaRepository <Bike, Long> {
}
这几年内容更新很差。我正在尝试实现自 springboot 3.0++ 以来的主要更改,考虑到一些主要的依赖项迁移。
某些依赖项兼容性可能是导致问题的原因。
此外,如上所述,错误“创建名称为“entityManagerFactory”的 bean 时出错”对我来说是非常误导的。
因此,经过 2 天的搜索、文档、mvn 全新安装、试验和错误、版本控制和 chatgpt 之间的随机猜测,我在这里留言寻求帮助。
非常感谢。
查尔斯
好吧,我终于解决了这个问题。
1) Hibernate 社区是关键
首先需要了解的是,从 Hibernate 6+ 开始,sqlite 方言已经从“hibernate core”转移到“hibernate Community dialect”。这在我的研究中得到了支持:
https://www.baeldung.com/spring-boot-sqlite
https://discourse.hibernate.org/t/varargssqlfunction-was-deleted-hibernate-6-0s-development/6826
所以我必须明确添加
spring.jpa.properties.hibernate.dialect=org.hibernate.community.dialect.SQLiteDialect
到那时,与以前不同,我的项目将成功构建。然而我还是无法开始。
2)Hibernate核心在sping data jpa中,必须排除
其次,Spring Data JPA 包含 Hibernate 作为其默认 JPA 提供程序。在我的例子中,“spring-data-jpa”包括“Hibernate core 6.2.7.FINAL”。当您运行应用程序并且 springboot 在 Hibernate 核心中查找 sqlite 方言时,默认使用此方言,但该方言不存在。
所以这里的技巧是在 pom.xml 中的 spring data jpa 依赖项中添加对 hibernate core 的排除
总而言之,您将找到我的 pom 和我的 application.properties。
# Hibernate Configuration
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.community.dialect.SQLiteDialect
# Datasource config for Sqlite
spring.datasource.url=jdbc:sqlite:bike.db
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.sqlite.JDBC
<?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.1.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.globomatics</groupId>
<artifactId>bike</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>bike</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
<spring.boot.version>3.1.3</spring.boot.version>
</properties>
<dependencies>
<!-- Other dependencies -->
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- SQLite Driver -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.44.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-community-dialects-->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-community-dialects</artifactId>
<version>6.2.7.Final</version>
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Spring Boot Maven Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>