【问题标题】:Spring Boot - creating endpoints that involve more than one database table - what is the best practiceSpring Boot - 创建涉及多个数据库表的端点 - 最佳实践是什么
【发布时间】: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


【解决方案1】:

Controllers 应该很轻,所以最好有单独的控制器。 通常最好有单独的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

【讨论】:

    猜你喜欢
    • 2019-11-23
    • 2022-01-07
    • 2011-06-23
    • 1970-01-01
    • 2023-04-10
    • 2011-02-05
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多