我正在编写一个与数据库交互的 Spring Boot 应用程序,当我尝试启动它时出现错误
org.springframework.beans.factory.BeanCreationException:在 JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration 上声明的 @EnableJpaRepositories 中定义的 com.example.demo.repos.LanguageRepository 中定义名称为“languageRepository”的 bean 创建错误:设置 bean 时无法解析对 bean 'jpaMappingContext' 的引用属性“映射上下文”;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“jpaMappingContext”的 bean 时出错:调用 init 方法失败;嵌套异常是 org.hibernate.service.spi.ServiceException:无法创建请求的服务 [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
使用spring boot 2.3.3.RELEASE版本时出现错误。如果我使用 2.1.6 版本,那么一切正常。有什么问题?
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>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
LanguageRepository.java:
package com.example.demo.repos;
import com.example.demo.domain.Language;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface LanguageRepository extends JpaRepository<Language, Long> {
Language findByNameLanguage(String name);
List<Language> findByInformationProductsNotEmpty();
}
语言.java:
package com.example.demo.domain;
import javax.persistence.*;
import java.util.List;
@Entity
@Table(name = "language")
public class Language {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "id_language")
private Long idLanguage;
@Column(nullable = false, name="name_language", unique = true)
private String nameLanguage;
@OneToMany(mappedBy = "language", cascade = CascadeType.ALL, orphanRemoval = true)
private List<InformationProduct> informationProducts;
public Language() {
}
public Language(String nameLanguage) {
this.nameLanguage = nameLanguage;
}
// геттеры и сеттеры
public Long getIdLanguage() {
return idLanguage;
}
public void setIdLanguage(Long idLanguage) {
this.idLanguage = idLanguage;
}
public String getNameLanguage() {
return nameLanguage;
}
public void setNameLanguage(String nameLanguage) {
this.nameLanguage = nameLanguage;
}
public List<InformationProduct> getInformationProducts() {
return informationProducts;
}
public void setInformationProducts(List<InformationProduct> informationProducts) {
this.informationProducts = informationProducts;
}
}
应用程序属性:
spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost/mydb}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME:postgres}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:123}
spring.jpa.generate-ddl=true
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create
spring.freemarker.expose-request-attributes=true
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
找到了答案,原来需要在application.properties中加入下面这行: