मेरा एक संबंध है N:M 2 संस्थाओं के बीच, "पूर्व छात्र" और "कर्सो":

Alumno

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "alumno")
public class Alumno {

    @Id
    @GeneratedValue
    private int id;
    private String name;
    private String dni;
    private int age;

    @ManyToMany(mappedBy = "alumnos", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Curso> cursos;


}

Curso

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "curso")
public class Curso {
    @Id
    @GeneratedValue
    private int id;
    private String name;
    private int length;

    @ManyToMany
    private List<Alumno> alumnos;
}

AlumnoService पर मेरे पास निम्नलिखित दो तरीके हैं:

    @Autowired
    private AlumnoRepository repository;

    @Autowired
    private CursoService cursoService;

...
//Non-related stuff
...

    public Alumno updateAlumno(Alumno alumno) {
        Alumno existingAlumno = repository.findById(alumno.getId()).orElse(null);
        existingAlumno.setName(alumno.getName());
        existingAlumno.setDni(alumno.getDni());
        existingAlumno.setAge(alumno.getAge());


        return repository.save(existingAlumno);
    }

    public Alumno insertCurso(int id_alumno, int id_curso) {
        Alumno alumno = repository.findById(id_alumno).orElse(null);
        System.out.println("Found alumno:  => " + alumno.getId() + " " + alumno.getName());
        Curso curso = cursoService.getCursoById(id_curso);
        System.out.println("Found curso:  => " + curso.getId() + " " + curso.getName());
        alumno.getCursos().add(curso);

        System.out.println("========");
        for (Curso c: alumno.getCursos()) {
            System.out.println(c.getId() + " " + c.getName());
        }
        System.out.println("==========");

        return updateAlumno(alumno);
    }

मुद्रित पंक्तियों के अनुसार, सभी डेटा सही ढंग से प्राप्त होते हैं, और डाकिया पर मुझे एक सही उत्तर मिलता है:

{
    "id": 2,
    "name": "Marta",
    "dni": "67242062K",
    "age": 15,
    "cursos": [
        {
            "id": 3,
            "name": "Bootstrap 4",
            "length": 11,
            "alumnos": []
        }
    ]
}

यह AlumnoController है:

    @Autowired
    private AlumnoService service;

    @PutMapping("/insertCurso/{id_a}/{id_c}")
    public Alumno insertCurso(@PathVariable("id_a") int id_a, @PathVariable("id_c") int id_c) {
        return service.insertCurso(id_a, id_c);
    }

हालाँकि, डेटाबेस का निरीक्षण करने पर, साझा तालिका खाली है: Description

मुद्दा क्या हो सकता है पर कोई विचार? क्या मुझे कुछ याद आया? मैं स्प्रिंग बूट के लिए बिल्कुल नया हूँ।

अपना समय देने के लिए धन्यवाद

सादर

0
Luis Fernandez 18 जिंदा 2021, 14:48

2 जवाब

सबसे बढ़िया उत्तर

मैंने पाया कि समस्या संस्थाओं की टिप्पणियों पर थी। यहाँ एक समाधान है कि (जहाँ तक मुझे पता है) काम करता है:

Alumno

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "alumno")
public class Alumno {

    @Id
    @GeneratedValue
    private int id;
    private String name;
    private String dni;
    private int age;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "matriculas",
            joinColumns = @JoinColumn(name = "alumno_id"),
            inverseJoinColumns = @JoinColumn(name = "curso_id")
    )
    @JsonIgnore
    private List<Curso> cursos = new ArrayList<>();


}

यहां मैंने सूचियों को प्रदर्शित करते समय स्टैक ओवरफ्लो की ओर अग्रसर होने वाले रिकर्सन से बचने के लिए @JsonIgnore जोड़ा।

Curso

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "curso")
public class Curso {
    @Id
    @GeneratedValue
    private int id;
    private String name;
    private int length;

    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "cursos")
    private List<Alumno> alumnos = new ArrayList<>();
}

यहाँ मैंने @ManyToMany में mappedBy विशेषता जोड़ी। यही कारण था कि यह ठीक से नकल नहीं कर रहा था।

0
Luis Fernandez 18 जिंदा 2021, 18:39

org.springframework.transaction.annotation पैकेज से @Transactional एनोटेशन का उपयोग करने का प्रयास करें और देखें कि क्या यह काम करता है।

इस कदर:

@Transactional
public Alumno insertCurso(int id_alumno, int id_curso) {
    Alumno alumno = repository.findById(id_alumno).orElse(null);
    System.out.println("Found alumno:  => " + alumno.getId() + " " + alumno.getName());
    Curso curso = cursoService.getCursoById(id_curso);
    System.out.println("Found curso:  => " + curso.getId() + " " + curso.getName());
    alumno.getCursos().add(curso);

    System.out.println("========");
    for (Curso c: alumno.getCursos()) {
        System.out.println(c.getId() + " " + c.getName());
    }
    System.out.println("==========");

    return updateAlumno(alumno);
}
0
Suraj Gautam 18 जिंदा 2021, 17:30