在 https://www.baeldung.com/spring-data-key-value 使用 Spring 3.1 和 Java 17 时,我收到错误消息,除非我添加 @Enitity,否则不会创建 Repo。为什么?博客有错吗?我发现缺陷了吗?
没有@Entity的错误
2023-10-21T10:17:06.706-05:00 INFO 3536 --- [ main] .RepositoryConfigurationExtensionSupport :Spring Data Map - 无法安全地识别存储库候选接口 com.example.demo.sql.Repo 的存储分配;如果您希望此存储库成为 Map 存储库,请考虑使用您的存储库扩展以下类型之一: org.springframework.data.keyvalue.repository.KeyValueRepository
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.5</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</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-keyvalue</artifactId> </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> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
应用程序.属性
spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=sa spring.h2.console.enabled=true spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
package com.example.demo.sql;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import org.springframework.data.keyvalue.annotation.KeySpace;
@KeySpace
**@Entity**
public class KeyValue {
@Id
public String key;
public String value;
}
package com.example.demo.sql;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface Repo extends CrudRepository<KeyValue, String> {
}
package com.example.demo;
import com.example.demo.sql.Repo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.map.repository.config.EnableMapRepositories;
@SpringBootApplication
@EnableMapRepositories
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public String bean(Repo repo) {
return repo.toString();
}
}
根据https://github.com/spring-projects/spring-data-keyvalue/issues/541答案是,如果我不引入 spring-boot-starter-data-jpa 那么它无需引入
@Entity
注释。要构建加载 spring-data 的键值存储库,请使用 KeyValueRepository
而不是 CrudRepository
。