Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Nested Resources Java: Корпоративные приложения на Spring Boot

Связанные сущности Автор и Книга

У автора может быть много книг, но книга написана одним автором

Книга принадлежит автору. Отразим эту иерархию, сделав книгу вложенным ресурсом

GET /authors/king/books/32

Сущность Автор

public class Author {

    private long id;

    private String name;

    @JsonIgnore
    @OneToMany(
        cascade = CascadeType.ALL,
        fetch = FetchType.LAZY,
        mappedBy = "author"
    )
    private List<Book> books;
}

Сущность Книга

public class Book {

    private long id;

    private String title;

    @Lob
    private String content;

    // Связанная сущность
    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnore
    private Author author;
}

Репозиторий

@Repository
public interface BookRepository extends CrudRepository<Book, Long> {

    // Можно использовать именование методов репозитория для автоматической генерации запроса
    // Поиск всех книг по имени автора
    Iterable<Book> findAllByAuthorName(String name);
    // Поиск книги по её id у конкретного автора
    Optional<Book> findByIdAndAuthorName(Long id, String name);
    // Подробнее о правилах именования методов можно прочитать в документации
}

Контроллер

@RestController
@RequestMapping("/authors")
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    // GET /authors/king/books
    // Получаем все книги автора
    @GetMapping(path = "/{name}/books")
    public Iterable<Book> getAuthorBooks(@PathVariable String name) {
        return bookRepository.findAllByAuthorName(name);
    }

    // GET /authors/king/books/23
    // Получаем конкретную книгу конкретного автора
    @GetMapping(path = "/{name}/books/{bookId}")
    public Book getBook(@PathVariable String name, @PathVariable long bookId) {

        // Ищем книгу по id у конкретного автора
        return bookRepository.findByIdAndAuthorName(name, bookId)
            // Если книги с таким id у этого автора нет,
            // Возвращаем ответ с кодом 404
            .orElseThrow(() -> new ResourceNotFoundException("Book not found"));
    }
}

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 5 октября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»