Spring 数据 Jdbc: 嵌套一对多关系实现中的名称不能为空错误
Spring Data Jdbc: Name must not be empty error on nested one to many relationship implementation
我正在使用 Spring Boot 2.2.0.RELEASE
和 spring-data-jdbc 1.1.0.RELEASE
尝试使用 spring-data-jdbc 实现嵌套的一对多关系。
一本书有很多章节,每一章又分为很多部分。
public class Book {
private Set<Chapter> chapters = new HashSet<>();
public Set<Chapter> getChapters(){
return chapters;
}
}
public class Chapter{
public Set<Part> getParts() {
return parts;
}
private Set<Part> parts = new HashSet<>();
}
public class Part { }
public interface BookCrudRepository extends CrudRepository<Book, Long> {
public Set<Book> findAll();
}
@Autowired
BookRepository bookRepository;
@GetMapping("/book")
public Set<Book> getBookList() {
return bookCrudRepository.findAll();
}
CREATE TABLE IF NOT EXISTS book (
id SERIAL PRIMARY KEY,
);
CREATE TABLE IF NOT EXISTS chapter (
id SERIAL PRIMARY KEY,
book_id int references book(id),
);
CREATE TABLE IF NOT EXISTS part (
chapter_id int references chapter(id),
);
没有部分,找到所有 returns 所有有章节的书。对于 Part,我收到了这个运行时错误:
java.lang.IllegalArgumentException: Name must not be empty!
at org.springframework.util.Assert.hasText(Assert.java:284) ~[spring-core-5.2.0.RELEASE.jar:5.2.0.RELEASE]
at org.springframework.data.relational.domain.Identifier.withPart(Identifier.java:116) ~[spring-data-relational-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.resolveRelation(BasicJdbcConverter.java:349) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.readOrLoadProperty(BasicJdbcConverter.java:333) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.populateProperties(BasicJdbcConverter.java:322) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.createInstanceInternal(BasicJdbcConverter.java:458) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.mapRow(BasicJdbcConverter.java:307) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter.mapRow(BasicJdbcConverter.java:252) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.EntityRowMapper.mapRow(EntityRowMapper.java:68) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:94) ~[spring-jdbc-5.2.0.RELEASE.jar:5.2.0.RELEASE]
根据您发布的来源,您的 none 个实体有一个 ID,尽管架构显示 Book
和 Chapter
可能有一个。
Page
如果要存储在 Set
.
中也需要一个
基本上,聚合根 (Book
) 和存储在 Set
中的所有实体都需要一个 ID。
直接引用或通过 List
或 Map
引用的实体不需要 ID,因为可以从引用实体以及列表索引或映射键中获取 ID。
我正在使用 Spring Boot 2.2.0.RELEASE
和 spring-data-jdbc 1.1.0.RELEASE
尝试使用 spring-data-jdbc 实现嵌套的一对多关系。
一本书有很多章节,每一章又分为很多部分。
public class Book {
private Set<Chapter> chapters = new HashSet<>();
public Set<Chapter> getChapters(){
return chapters;
}
}
public class Chapter{
public Set<Part> getParts() {
return parts;
}
private Set<Part> parts = new HashSet<>();
}
public class Part { }
public interface BookCrudRepository extends CrudRepository<Book, Long> {
public Set<Book> findAll();
}
@Autowired
BookRepository bookRepository;
@GetMapping("/book")
public Set<Book> getBookList() {
return bookCrudRepository.findAll();
}
CREATE TABLE IF NOT EXISTS book (
id SERIAL PRIMARY KEY,
);
CREATE TABLE IF NOT EXISTS chapter (
id SERIAL PRIMARY KEY,
book_id int references book(id),
);
CREATE TABLE IF NOT EXISTS part (
chapter_id int references chapter(id),
);
没有部分,找到所有 returns 所有有章节的书。对于 Part,我收到了这个运行时错误:
java.lang.IllegalArgumentException: Name must not be empty!
at org.springframework.util.Assert.hasText(Assert.java:284) ~[spring-core-5.2.0.RELEASE.jar:5.2.0.RELEASE]
at org.springframework.data.relational.domain.Identifier.withPart(Identifier.java:116) ~[spring-data-relational-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.resolveRelation(BasicJdbcConverter.java:349) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.readOrLoadProperty(BasicJdbcConverter.java:333) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.populateProperties(BasicJdbcConverter.java:322) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.createInstanceInternal(BasicJdbcConverter.java:458) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter$ReadingContext.mapRow(BasicJdbcConverter.java:307) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.BasicJdbcConverter.mapRow(BasicJdbcConverter.java:252) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.data.jdbc.core.convert.EntityRowMapper.mapRow(EntityRowMapper.java:68) ~[spring-data-jdbc-1.1.0.RELEASE.jar:1.1.0.RELEASE]
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:94) ~[spring-jdbc-5.2.0.RELEASE.jar:5.2.0.RELEASE]
根据您发布的来源,您的 none 个实体有一个 ID,尽管架构显示 Book
和 Chapter
可能有一个。
Page
如果要存储在 Set
.
基本上,聚合根 (Book
) 和存储在 Set
中的所有实体都需要一个 ID。
直接引用或通过 List
或 Map
引用的实体不需要 ID,因为可以从引用实体以及列表索引或映射键中获取 ID。