Spring Data Jdbc: имя не должно быть пустой ошибкой при реализации вложенных отношений «один ко многим»

Я использую 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),
);

Без Part findAll возвращает все книги с главами. С 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]

person David    schedule 23.10.2019    source источник
comment
Как выглядит ваш метод, когда вы вызываете findAll с частями?   -  person Simon Martinelli    schedule 23.10.2019
comment
@SimonMartinelli Я вызываю только bookCrudRepository.findAll()   -  person David    schedule 23.10.2019
comment
Это намеренно, что часть не имеет первичного ключа? Я уверен, что именно поэтому вы получаете IllegalArgumentException   -  person qutax    schedule 23.10.2019


Ответы (1)


Согласно опубликованному вами источнику, ни у одной из ваших сущностей нет идентификатора, хотя схема показывает, что Book и Chapter, вероятно, имеют его.

Page он также нужен, если он должен храниться в Set.

В основном совокупный корень (Book) и все объекты, хранящиеся в Set, нуждаются в идентификаторе.

Объекты, на которые ссылаются напрямую или через List или Map, не нуждаются в идентификаторе, поскольку получают идентификатор из ссылающегося объекта плюс индекс списка или ключ карты.

person Jens Schauder    schedule 24.10.2019