java - 如何使用 JPA 关系实体创建 RestAPI

标签 java spring spring-data-jpa postman spring-rest

我有一个问题。当我有其他实体时,我不知道如何创建 API。我与 Postman 合作,当我请求查看数据库中的所有项目时,我也想接收这些实体。

例如,这是我的实体:

@Entity
@Table(name = "project")
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "proj_id")
    private int projectId;

    @Column(name = "project_name")
    private String projectName;

    @Column(name = "dg_number")
    private int dgNumber;

    @ManyToMany
    @JoinTable(name = "project_gate_relation", joinColumns = @JoinColumn(name = "proj_id"), inverseJoinColumns = @JoinColumn(name = "gate_id"))
    @JsonBackReference
    private  List<Gate> gates;

    @ManyToMany
    @JoinTable(name = "project_threshold_relation", joinColumns = @JoinColumn(name = "proj_id"), inverseJoinColumns = @JoinColumn(name = "thresholdgates_id"))
    @JsonBackReference
    private  List<Threshold> thresholds;

这是门实体

@Entity
@Table(name = "gate")
public class Gate {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "gate_id")
    private int gateId;

    @Column(name = "gate_type")
    private String gateType;

    @Column(name = "gate_value")
    private float value;

阈值实体

@Entity
@Table(name = "threshold")
public class Threshold {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "threshold_id")
    private int thresholdId;

    @Column(name = "threshold_value")
    private int thresholdValue;

    @Column(name = "threshold_type")
    private String thresholdType;

Controller

@RestController
@RequestMapping(ProjectController.PROJECT_URL)
public class ProjectController {

    public static final String PROJECT_URL = "/cidashboard/projects";

    @Autowired
    private final ProjectService projectService;

    public ProjectController(ProjectService projectService) {
        this.projectService = projectService;
    }

    @GetMapping
    public List<Project> getAllProjects(){
        return projectService.findAllProjects();
    }

    @GetMapping("/{id}")
    public Project getProjectById(@PathVariable int id) {
        return projectService.findProjectById(id);
    }

    @PostMapping
 //   @Consumes(MediaType.APPLICATION_JSON_VALUE)
    public Project saveProject(@RequestBody Project newProj) {
        return projectService.saveProject(newProj);
    }
}

当我在 Postman 中执行 Get 请求时,我收到以下输出:

 {
        "projectId": 1,
        "projectName": "jenkins",
        "dgnumber": 1
    }, 

我也希望收到有关门和阈值的信息。我不明白如何更准确地做这件事。

最佳答案

JPA 中默认不加载相关实体。您必须在@ManyToMany关系中定义fetch = FetchType.EAGER

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "project_gate_relation", joinColumns = @JoinColumn(name = "proj_id"), inverseJoinColumns = @JoinColumn(name = "gate_id"))
@JsonBackReference
private  List<Gate> gates;

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "project_threshold_relation", joinColumns = @JoinColumn(name = "proj_id"), inverseJoinColumns = @JoinColumn(name = "thresholdgates_id"))
@JsonBackReference
private  List<Threshold> thresholds;

关于java - 如何使用 JPA 关系实体创建 RestAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52520910/

相关文章:

spring - Grails中的域类

java - 将服务的 getBean 替换为 @Autowired

java - 由于数字以不同语言显示,Eclipse 中的 WindowBuilder 出现错误

java - 如何从java调用用汇编语言代码编写的函数?

java - 禁止 Spring 接受 POST 参数作为查询参数

java - 使用JPA(条件搜索)在springboot中根据除ID之外的其他字段查找表中的所有记录

java - 为什么 Arraylist<String> 作为一个长而随机的字符串存储在 H2 数据库中?

java - 如何创建一个 ListView ,以便单击每个列表项将打开不同的 Activity ?

java - 安卓/Java : how to define a code block and leave it without custom exceptions?

spring - 如何避免org.springframework.transaction.UnexpectedRollbackException?