Как прекратить вставку в родительскую таблицу, если внешний ключ существует в составном ключе дочерней таблицы в jpa в @ManyToOne двунаправленный? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть две таблицы: одна таблица классов, которая является родительской таблицей, а другая таблица учеников, которая является дочерней таблицей в двунаправленном отображении @OneToMany:

@Entity
@Table
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@IdClass(ClassId.class)
public class Class implements Persistable<ClassId> {


    @Id
    private String className;

    @Id
    private String classId;


    @Column
    private String classContent;

    @JsonIgnore
    @OneToMany(mappedBy = "class_fk",cascade = CascadeType.ALL)
    private List<Student> studentList;


    @Override
    public ClassId getId() {

        return new classId//using builder
    }

    @Override
    public boolean isNew() {
        return true;
    }
}

Другая таблица учеников:

@Entity
@Table
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
@IdClass(StudetnId.class)
public class Student implements Persistable<StudetnId> {

    @Id
    @Column
    private String studentName;

    @Id
    @Column
    private String studentGroup;

    @Id
    @ManyToOne
    @JoinColumns ({
            @JoinColumn(
                    name = "className",referencedColumnName = "className"),
            @JoinColumn(
                    name = "classId",referencedColumnName = "classId")
    })
    private Class class_fk;


    @Column
    private String displayName;

    @Column
    private String active;

    @Override
    public StudentId getId() {
        return new StudentId//using builder
    }

    @Override
    public boolean isNew() {
        return true;
    }
}

И класс студенческого идентификатора является составным ключом, который содержит class, studentName и studentGroup, где данные внутри класса, т.е. className и classId, являются как внешним ключом, так и первичным ключом.

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentId implements Serializable {

    private Class class;
    private String studentName;
    private String studentGroup;
}

Проблема в том, что всякий раз, когда я выполняю studentRepo.save (studentEntity), он вставляет данные как в таблицу, т. Е. В таблицу классов, так и в таблицу учеников.

Требуется, чтобы мы вставляли в таблицу учеников, чей внешний ключт.е. имя класса и идентификатор класса не существует в таблице классов, тогда hibernate должен выдать ошибку вместо вставки в обе таблицы.

Class classOne = Class.builder().className("Sec-B").classID("111").build();
Student student = Student.builder().studentName("Niladri").studentGroup("Science").class_fk(classOne).displayName("ScienceBackground").active("true").build().
studentRepo.save(student);

Сначала вставьте в класс, а затем вставьте в ученика.

...