#spring #hibernate #jpa
#весна #зимовать #jpa
Вопрос:
Я пытаюсь спасти многих студентов и тареев, но я не могу этого сделать, я действительно больше не знаю, что делать, я перепробовал все, но я не знаю, что не так в моем коде.только один студент может быть сохранен в моей базе данных….
метод сохранения (метод обслуживания, в котором используется логика)
@Override @Transactional public void saveTarea(Tarea tarea) { Listlt;TareaStudentsgt; tareasStudents = new ArrayListlt;TareaStudentsgt;(); Courses course = courseDAO.findCourse(tarea.getCourseId()); tarea.setCourse(course); Listlt;Studentgt; students = studentDAO.findStudentsByCourse(tarea.getCourseId()); for(Student student : students) { TareaStudents tareasStudent = new TareaStudents(); tareasStudent.setTarea(tarea); tareasStudent.setStudent(student); tarea.getStudents().add(tareasStudent); } tareasDAO.saveTarea(tarea); }
таблица tareas_students
@Entity @Table(name = "tareas_students") public class TareaStudents { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private Integer id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "id_tarea") private Tarea tarea; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "id_student") private Student student;
Класс тареа
@Entity @Table(name = "tareas") public class Tarea { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private Integer id; @Column @Size(max = 20, message = "la longitud es demasiado larga") @NotBlank(message = "El campo no puede estar vacio") private String nombre; @Column(name="code") @Pattern(regexp = "(TL-)([1-9]{4})",message = "el dato introducido no es correcto") private String codigo; @Column(name="fecha_entrega") @DateTimeFormat (pattern="dd/MM/yyyy") private LocalDate entregaDate; @Column @NotBlank(message = "El campo no puede estar vacio") private String descripcion; @OneToMany(mappedBy = "student") private Setlt;TareaStudentsgt; students = new HashSetlt;TareaStudentsgt;();
Ученик класса
@Entity @Table(name = "students") public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private Integer id; @Column @Size(max = 20, message = "la longitud es demasiado larga") @NotBlank(message = "El campo no puede estar vacio") private String nombre; @Column @Size(max = 20, message = "la longitud es demasiado larga") @NotBlank(message = "El campo no puede estar vacio") private String apellido; @Column @Pattern(regexp = "\d{8}[a-z A-Z]",message = "el dato introducido no es correcto") private String dni; @OneToOne(mappedBy = "student",cascade= {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH}) private User user; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "id_genero", referencedColumnName = "id") private Genero genero; @Transient private int generoOptionId; @ManyToMany(fetch=FetchType.LAZY, cascade= {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH}) @JoinTable( name="courses_students", joinColumns=@JoinColumn(name="id_student"), inverseJoinColumns=@JoinColumn(name="id_course") ) private Setlt;Coursesgt; courses = new HashSetlt;Coursesgt;(); @OneToMany(mappedBy = "tarea") private Setlt;TareaStudentsgt; tareas = new HashSetlt;TareaStudentsgt;();
Комментарии:
1. Вы сохраняете только экземпляр Tarea, больше ничего. Вам нужен способ сохранить другие объекты на графике (например, TareaStudents), либо напрямую вызывая persist/merge для них, либо определяя, где находятся операции каскада persist/merge. Вы не установили обратный указатель на TareaStudents, чтобы он указывал на Tarea, поэтому его FK не следует устанавливать. Однако неясно, в чем ваша проблема, поскольку вы упоминаете проблемы с сохранением ученика и даже многие другие отношения в описании проблемы, но показываете только сохранение Тареи, которая ссылается на существующие экземпляры учащихся.