Как создать RestAPI с реляционными сущностями JPA - PullRequest
0 голосов
/ 26 сентября 2018

У меня проблема.Я не знаю, как создать API, когда у меня есть другие объекты.Я работаю с Почтальоном, и когда я делаю запрос на просмотр всех проектов из базы данных, я хочу также получать сущности.

Например, это моя сущность:

@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;

Контроллер

@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);
    }
}

Когда я делаю запрос Get в Почтальоне, я получаю такой вывод, например:

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

Я ожидаю также получить информацию о гейте и пороге.Я не понимаю, как сделать это более точно.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

связанные объекты не загружаются по умолчанию в JPA.вы должны определить fetch = FetchType.EAGER в отношении @ManyToMany

@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;
0 голосов
/ 26 сентября 2018

Данные, связанные с @ManyToMany, по умолчанию загружаются лениво.Вам нужно указать, что вы хотите в загруженной версии (если вы используете spring-data, для этого могут использоваться графы сущностей).

Для получения подробной информации см. Ссылку: Spring Data JPA и NamedEntityGraphs

...