Spring Boot — создание конечных точек, которые включают более одной таблицы базы данных — какова наилучшая практика

#spring #spring-boot #jpa #spring-data-jpa #many-to-many

#spring #весенняя загрузка #jpa #spring-data-jpa #многие ко многим

Вопрос:

Я делаю учебное пособие по spring boot для развлечения. Я понимаю, что каждая сущность может быть определена моделью с репозиторием, который контроллер для этой сущности использует для создания конечных точек. Мне интересно, как лучше всего создать конечную точку в контроллере, который включает в себя более одной модели. Т.е. у нас есть модель сеанса и модель динамика ниже, и я хочу иметь конечную точку, которая возвращает все сеансы с динамиком определенной фамилии (многие ко многим). Должен ли я использовать оба репозитория? Является ли хорошей практикой даже помещать это в контроллер сеанса, поскольку в нем также задействован динамик? Смотрите пример ниже. Извините, если вопрос глупый, я пытаюсь изучить Spring-Boot, и я совершенно новичок в этом.

 //Session class
@Entity(name="sessions")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Session {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long session_id;
    private String session_name;
    private String session_description;
    private Integer session_length;

    @ManyToMany
    @JoinTable(
            name = "session_speakers",
            joinColumns = @JoinColumn(name="session_id"),
            inverseJoinColumns = @JoinColumn(name= "speaker_id"))
    private List<Speaker> speakers;
}

//Speaker
@Entity(name="speakers")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Speaker {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long speaker_id;
    private String first_name;
    private String last_name;
    private String title;
    private String company;
    private String speaker_bio;

    @ManyToMany(mappedBy = "speakers")
    @JsonIgnore
    private List<Session> sessions;

@RestController
@RequestMapping("/api/v1/sessions")
public class SessionsController {

    @Autowired
    private SessionRepository sessionRepository;

    @GetMapping
    @RequestMapping("{id}")
    public Session getSessionsBySpeakerName(@PathVariable String lname{
       //want to implement
    }

 

Комментарии:

1. Да, это будет принадлежать, SessionsController потому что это сеансы, которые вы извлекаете. SessionRepository Для этого вам нужно только добавить к нему метод, который извлекает сеансы с нужными вам критериями. Я не совсем уверен, можете ли вы сделать это с помощью именованного запроса здесь, возможно, вам нужно использовать @Query аннотацию или создать пользовательскую реализацию, Querydsl например. Хорошая практика, которую вы можете реализовать, — это добавить уровень обслуживания для каждого логического объекта, который у вас есть, и внедрять службы только в другие службы вместо репозиториев.

Ответ №1:

Controllers предполагается, что они очень легкие, поэтому было бы лучше иметь отдельные контроллеры. Обычно полезно также иметь seperate Repositories , чтобы позже, если вы захотите добавить новую таблицу, вы не касались существующего стабильного кода, он должен быть как можно более слабо связан. Вот несколько сообщений в блоге, которые я нашел полезными.

https://www.e4developer.com/2018/08/06/spring-boot-best-practices/

https://dzone.com/articles/spring-boot-best-practices-for-microservices

https://www.javaguides.net/2019/03/spring-boot-best-practices.html