Spring Boot-创建涉及多个数据库表的端点-最佳实践是什么

Spring Boot-创建涉及多个数据库表的端点-最佳实践是什么,spring,spring-boot,jpa,spring-data-jpa,many-to-many,Spring,Spring Boot,Jpa,Spring Data Jpa,Many To Many,我正在做一个春季开机的乐趣教程。我知道每个实体都可以由一个模型定义,该模型具有一个存储库,该实体的控制器使用该存储库创建端点。我想知道在涉及多个模型的控制器中创建端点的最佳实践是什么。也就是说,下面我们有一个会话模型和演讲者模型,我想有一个端点,返回所有与某个姓氏(多对多)演讲者的会话。我必须同时使用这两个存储库吗?把它放在会话的控制器中是否是一种好的做法,因为它还涉及到说话人?请参见下面的示例。对不起,如果这个问题很愚蠢,我正在尝试学习SpringBoot,我对它完全陌生 //Session

我正在做一个春季开机的乐趣教程。我知道每个实体都可以由一个模型定义,该模型具有一个存储库,该实体的控制器使用该存储库创建端点。我想知道在涉及多个模型的控制器中创建端点的最佳实践是什么。也就是说,下面我们有一个会话模型和演讲者模型,我想有一个端点,返回所有与某个姓氏(多对多)演讲者的会话。我必须同时使用这两个存储库吗?把它放在会话的控制器中是否是一种好的做法,因为它还涉及到说话人?请参见下面的示例。对不起,如果这个问题很愚蠢,我正在尝试学习SpringBoot,我对它完全陌生

//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
    }

//会话类
@实体(name=“sessions”)
@JsonIgnoreProperties({“HibernateLazInitializer”,“handler”})
公开课{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长会话id;
私有字符串会话名称;
私有字符串会话描述;
私有整数会话长度;
@许多
@可接合(
name=“session\u演讲者”,
joinColumns=@JoinColumn(name=“session\u id”),
inverseJoinColumns=@JoinColumn(name=“speaker\u id”))
非公开发言者名单;
}
//演讲者
@实体(名称=“发言人”)
@JsonIgnoreProperties({“HibernateLazInitializer”,“handler”})
公共课演讲者{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长扬声器id;
私有字符串名;
私有字符串姓氏;
私有字符串标题;
私人弦公司;
私人弦乐扬声器;
@许多人(mappedBy=“演讲者”)
@杰索尼奥雷
非公开名单会议;
@RestController
@请求映射(“/api/v1/sessions”)
公共类会话控制器{
@自动连线
私有SessionRepository SessionRepository;
@GetMapping
@请求映射(“{id}”)
公共会话GetSessionBySpeakerName(@PathVariable String lname{
//想要实现
}

控制器
应该非常轻,所以最好有单独的控制器。 通常,最好有单独的
存储库
,这样以后如果您想添加一个新表,就不会触及现有的稳定代码,它应该尽可能地松散耦合 这里有一些我觉得有用的博客文章


是的,这将属于
SessionController
,因为您正在获取的是会话。为此,您只需要
SessionRepository
,只需向其添加一个方法,以获取具有所需条件的会话。我不确定您是否可以使用此处的命名查询来执行此操作,也许您必须使用de>@Query注释,或者使用
Querydsl
创建自定义实现。您可以实现的一个良好实践是为您拥有的每个逻辑实体添加一个服务层,并且只将服务注入存储库的其他服务instad。