Исправлено добавление объектов в ManyToMany. - PullRequest
0 голосов
/ 06 ноября 2019

Мне нужно проверить, добавлена ​​ли электронная почта пользователя в список студентов, и, если это так, связать этого пользователя с курсом.

java.lang.UnsupportedOperationException
    at java.util.Collections$1.remove(Collections.java:4684)
    at java.util.AbstractCollection.clear(AbstractCollection.java:436)
    at org.hibernate.collection.internal.PersistentSet.clear(PersistentSet.java:318)
    at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:581)
    at org.hibernate.type.CollectionType.replace(CollectionType.java:757)
    at org.hibernate.type.TypeHelper.replace(TypeHelper.java:167)

User Entity

@ManyToMany(cascade = CascadeType.MERGE)
    @JoinTable(
            name = "Student_Courses",
            joinColumns = {@JoinColumn(name = "student_id")},
            inverseJoinColumns = {@JoinColumn(name = "course_id")}
    )
    private Set<Course> availableCourses = new HashSet<>();

Сущность курса

@ManyToMany(mappedBy = "availableCourses")
    private Set<User> users = new HashSet<>();

UserService

public void bindStudentWithCoursesAfterRegistration(String email) {
        User user = userRepo.findFirstByEmail(email);
        List<CourseStudentEmails> studentEntriesInCourses = courseStudentEmailsRepo.findAllByEmail(email);

        if (studentEntriesInCourses.size() != 0){
            for (CourseStudentEmails entry : studentEntriesInCourses) {
                Course course = entry.getCourse();
                user.getAvailableCourses().add(course);
            }
        }
        userRepo.save(user);//Exception throws here
    }

Контроллер регистрации

    @PostMapping("/registration")
    public String addUser(User user, @RequestParam(value = "checkboxTeacher", required = false) String checkboxValue, Model model) {
 [//chek if user is already registered]
            userRepo.save(user);
            courseService.bindStudentWithCoursesAfterRegistration(user);
            return "redirect:/login";

    }

1 Ответ

0 голосов
/ 06 ноября 2019

Я полагаю, что вам не хватает правильного запроса для поиска подходящего CourseStudentEmails.

Если вы сохраняете коллекцию String как электронные письма в вашей сущности (CourseStudentEmails), вы можете запрашивать сущности на основе определенныхэлектронная почта как это:

@Query("SELECT c FROM CourseStudentEmails c WHERE ?1 member of c.emails")
List<CourseStudentEmails> findAllByEmail(String email);
...