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

Как остановить спящий режим, чтобы сделать выбор перед вставкой в ​​дочернюю таблицу в сопоставлении многие-к-одному?

У меня есть ученический стол:

    @Entity
    @Table
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @Data
    @IdClass(StudentId.class)

    public class Student implements Persistable<StudentId> {

        @Id
        private String studentUuid;

        @Id
        private String studentName;

        @Column
        private String sex;

        public Student(String studentUuid,String studentName){

            this.studentUuid = studentUuid;
            this.studentName = studentName;
        }

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns({
                @JoinColumn(
                        name = "classUuid",referencedColumnName = "classUuid"),
                @JoinColumn(
                        name = "className",referencedColumnName = "className")
        })
        private Class className;


        @Override
        public StudentId getId() {
            return new StudentId().builder().studentName(studentName).studentUuid(studentUuid).build();
        }

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

У меня есть таблица классов:

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


    @Id
    private String classUuid;

    @Id
    private String className;

    @Column
    private String classRoomNo;

    @Column
    private String classSize;

    @OneToMany(mappedBy = "className",cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    private List<Student> studentList;

    @Override
    public ClassId getId() {
        return new ClassId().builder().className(className).classUuid(classUuid).build();
    }

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

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

1 Ответ

0 голосов
/ 25 июня 2019

Если я вас правильно понимаю, вы хотите сохранить или использовать существующий класс (если существует) в рамках одного вызова. Лучший способ сделать это - вставить и обработать исключение в случае сбоя. Однако, лучшая практика - делать отдельные запросы к базе данных: во-первых, проверить, существует ли класс; во-вторых, вставить его (при необходимости), а затем вставить студента. Я бы посоветовал вам создать отдельный @Transactional сервисный метод, который бы выполнял эту операцию за вас. Просто так:

private final ClassRepository classRepository;

@Transactional
public Student createStudent(Object studentDto) {

    Class cls = classRepository.findByClassUuid(studentDto.getStudentClass().getClassUuid())
            // in case it returns optional
            .orElse(classRepository.save(Class.builder()
                    .className("..")
                    .classSize("..")
                    //...
            .build()));

    Student studentEntity = new Student();
    // setters skipped
    return studentRepo.save(studentEntity);
}

Просто убедитесь, что вы добавили имя пакета в ваш класс class, иначе компилятор подумает о java.lang.Class.

...