2
respostas

Carregamento Ansioso

Pessoal, estou com um problema interessante.

Um sistema onde temos paciente/cliente, médico/doutor e consulta como entidades e temos relacionamentos bidirecionais. Veja:

@Table(name = "medical_consultation")
public class MedicalConsultation {

    @Id
    @GeneratedValue
    private Long id;

    @JsonBackReference(value = "job-historical")
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="doctor_fk")
    //@Fetch(FetchMode.SELECT)
    private Doctor doctor;

    @JsonBackReference( value = "client-consultations-historical")
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="client_fk")
    //@Fetch(FetchMode.SUBSELECT)
    private Client client;

    @JsonFormat(pattern = "dd/MM/yyyy hh:mm")
    private Date date;

    private BigDecimal price;
@Entity(name = "doctor")
public class Doctor {

    @Id
    @GeneratedValue
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    private Person person;

    @JsonManagedReference(value = "job-historical")
    @OneToMany(mappedBy = "doctor", fetch = FetchType.EAGER ,cascade = CascadeType.ALL)
    //@Fetch(FetchMode.SUBSELECT)
    private List<MedicalConsultation> medicalConsultations;

    @Enumerated
    private Type type;

    @ElementCollection
    private List<String> specialties;
@Entity(name = "client")
public class Client{

    @Id @GeneratedValue
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    private Person person;

    @JsonManagedReference(value = "client-consultations-historical")
    @OneToMany(mappedBy="doctor" , fetch = FetchType.EAGER ,cascade = CascadeType.ALL)
    //@Fetch(FetchMode.SUBSELECT)
    private List<MedicalConsultation> medicalConsultations;

Em resumo, após cadastrar um cliente e um doutor (até então sem consulta), quando eu crio(cadastro) uma consulta, relaciono o cliente e o doutor já cadastrado. O problema que estou tendo é que meus GETs estão retornando uma lista vazia de consultas quando eu faço o GETClients:

@GetMapping("/clients")
    public List<Client> getClients(){        
        List<Client> clients = this.clientRepo.findAll();
        return clients;
    }

Ou seja, o carregamento não está acontecendo. Outros problemas são semelhantes a esse. Então, se eu souber corrigir esse, talvez eu consiga lidar com os outros.

Alguém tem alguma dica para mim?

PS.: O Curioso é que a lista de doutores vem com as consultas.

@GetMapping("/doctors")
    public List<Doctor> getDoctors(){
        return this.doctorRepo.findAll();
    }
2 respostas

Fala Marcos, tudo bem?

O problema está na classe Client. Perceba que no relacionamento @OneToMany você está usando

mappedBy = "doctor"

enquanto o correto é

mappedBy = "client"

Abraço!

Meu amigo, você me ajudou demais! Foi essa bobagem mesmo.

Mas o mesmo problema tem ocorrido na classe MedicalConsultation. Quando eu dou um get nela, não consigo ver a relação dos clients e doutores.

@Table(name = "medical_consultation")
public class MedicalConsultation {

    @Id
    @GeneratedValue
    private Long id;

    @JsonBackReference(value = "job-historical")
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="doctor_fk")
    private Doctor doctor;

    @JsonBackReference( value = "client-consultations-historical")
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="client_fk")
    private Client client;

    @JsonFormat(pattern = "dd/MM/yyyy hh:mm")
    private Date date;

    private BigDecimal price;