OneToMany映射在Controller Crud Spring Boot Rest API中不起作用

时间:2018-11-21 01:31:29

标签: java rest maven api spring-boot

我不知道如何通过api解决500状态响应。我正在与邮递员进行测试。

请求

{
        "nome": "Ciencia da Computação",
        "totalCreditos": 2333,
        "professor": {
            "id": 2,
            "matricula": 0,
            "nome": "José da silva"
    }
}

如何实现一对多关系并以正确的方式公开API以进行CRUD操作。 我遇到500错误。 我不知道是否需要更改Controller功能

CursoController.java

@CrossOrigin(origins = "*")
@RestController
@RequestMapping({"/api/curso"})
public class CursoController {
    @Autowired
    private CursoService cursoService;
    private ProfessorService professorService;

    @PostMapping
    public Curso create(@RequestBody Curso curso){
        return cursoService.create(curso);
    }

    @GetMapping(path = {"/{id}"})
    public Curso findOne(@PathVariable("id") int id){
        return cursoService.findById(id);
    }

    @PutMapping
    public Curso update(@RequestBody Curso Curso){
        return cursoService.update(Curso);
    }

    @DeleteMapping(path ={"/{id}"})
    public Curso delete(@PathVariable("id") int id) {
        return cursoService.delete(id);
    }

    @GetMapping
    public List findAll(){
        return cursoService.findAll();
    }
}

Curso.java

@Entity
@Table(name = "curso")
public class Curso implements Serializable {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long codigo;
    @Column
    private Long totalCreditos;

    @Column
    private String nome;

    @ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = 
    CascadeType.PERSIST)
    @JoinColumn(name = "professor_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonIgnore
    @JsonManagedReference
    private Professor professor;


}

2 个答案:

答案 0 :(得分:1)

永远不要在@ManyToOne上使用CascadeType.ALL,因为实体状态转换应该从父实体传播到子实体。

删除

(fetch = FetchType.LAZY, optional = false, cascade = 
    CascadeType.PERSIST)

来自

@ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = 
    CascadeType.PERSIST)

并将其添加到

 @OneToMany(fetch = FetchType.LAZY, optional = false, cascade = 
        CascadeType.PERSIST)

侧面。

说明:

如vladmihalcea在this article和他的书High-Performance Java Persistence中所述,您永远不要在CascadeType.ALL上使用@ManyToOne,因为entity state transitions应该从父实体传播到孩子的。

@ManyToOne端始终是Child关联,因为它应该映射基础FK。

因此,将CascadeType.ALL@ManyToOne关联移动到@OneToMany,由于它是the most efficient one-to-many mapping,因此应使用mappedBy属性。 `

答案 1 :(得分:0)

您可以使用CascadeType.ALL来级联所有操作(PERSIST,MERGE,REMOVE,REFRESH,DETACH)。 有关更多详细信息,请查看here