【发布时间】:2021-03-03 09:53:30
【问题描述】:
为了好玩,我正在做一个 Spring Boot 教程。我知道每个实体都可以由具有存储库的模型定义,该实体的控制器使用该存储库来创建端点。我想知道在涉及多个模型的控制器中创建端点的最佳实践是什么。 IE。我们在下面有一个会话模型和扬声器模型,我希望有一个端点来返回具有某个姓氏(多对多)的扬声器的所有会话。我必须使用两个存储库吗?因为它还涉及扬声器,所以将它放在会话的控制器中甚至是一种好习惯吗?请参见下面的示例。抱歉,如果这个问题很愚蠢,我正在尝试学习 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
}
【问题讨论】:
-
是的,这将属于
SessionsController,因为它是您正在获取的会话。为此,您只需要SessionRepository,只需向其中添加一个方法,即可获取符合您所需条件的会话。我不确定您是否可以在这里使用命名查询来执行此操作,也许您必须使用@Query注释,或者使用Querydsl创建自定义实现。您可以实施的一个好的做法是为您拥有的每个逻辑实体添加一个服务层,并且只将服务注入到存储库之外的其他服务中。
标签: spring spring-boot jpa spring-data-jpa many-to-many