#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