Отображение OneToMany не работает в Controller crud Spring Boot Rest API - PullRequest
0 голосов
/ 21 ноября 2018

Я не знаю, как решить 500 статус ответа API.Я тестирую с почтальоном.

Запрос

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

Как реализовать отношение Один-ко-многим и выставить API-интерфейс правильным способом для работы CRUD.Я получаю 500 ошибок.Я не знаю, нужно ли мне изменять функции контроллера

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 голосов
/ 21 ноября 2018

вы никогда не должны использовать CascadeType.ALL для @ManyToOne, поскольку переходы состояний сущностей должны распространяться от родительских сущностей к дочерним.

Удалить

(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)

.

Объяснение:

Как объяснил владмихалча в этой статье ив его книге High-Performance Java Persistence вы никогда не должны использовать CascadeType.ALL на @ManyToOne, поскольку переходы состояний сущностей должны распространяться от родительских сущностей к дочерним.

Сторона @ManyToOne всегда является дочерней ассоциацией, поскольку она должна отображать базовый FK.

Поэтому переместите CascadeType.ALL из ассоциации @ManyToOne в @OneToMany, которая должна использовать mappedBy атрибут, так как это наиболее эффективное отображение один-ко-многим .`

0 голосов
/ 21 ноября 2018

Можете ли вы использовать CascadeType.ALL, который каскадирует все операции (PERSIST,MERGE,REMOVE,REFRESH,DETACH).Для более подробной информации вы можете посмотреть здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...