Spring Boot метод «многие ко многим» не обновляет данные - PullRequest
0 голосов
/ 06 октября 2019

Мой User класс выглядит следующим образом:

@Data
@Entity
public class User {
    @Id
    Long userID;
    @ManyToMany(mappedBy = "admins")
    private List<ClassRoom> classRooms  = new ArrayList<>();
}

А мой ClassRoom класс выглядит так:

@Data
@Entity
public class ClassRoom {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long classRoomID;
    @ManyToMany
    @JoinTable(name ="classroom_user",
            joinColumns = @JoinColumn(name = "classroom_id"),
            inverseJoinColumns = @JoinColumn(name = "user_id"))
    private List<User> admins = new ArrayList<>();
}

И в моем UserController классе у меня есть:

@PostMapping("user/{id}/c")
User addClassRoom(@PathVariable Long id,@RequestBody ClassRoom newClassRoom)
{
    logger.debug(repository.findById(id));
    return repository.findById(id)
            .map(user -> {
                user.getClassRooms().add(newClassRoom);
                user.setClassRooms(user.getClassRooms());
                return repository.save(user);
            })
            .orElseGet(() -> {
                return null;
            });
}

А у меня POST и пусто JSON ({}) и я не вижу изменений в моих пользователях. Classroom или пустой Classroom не добавляются в User.

В чем здесь проблема? Как я могу решить эту проблему?

Ответы [ 3 ]

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

Можете ли вы вставить журналы, пожалуйста? Hibernate делает какие-либо вставки в ваш стол? Правильно ли была создана схема базы данных в БД? Одна вещь, которую я рекомендую вам сделать, это добавить пользовательское имя таблицы в верхней части вашего класса User, используя аннотации, например, так: @Table (name = "users"). В большинстве диалектов SQL пользователь является зарезервированным ключевым словом, поэтому рекомендуется всегда аннотировать класс User немного по-другому, чтобы у Hibernate не возникало проблем при создании таблицы для этого объекта.

0 голосов
/ 10 октября 2019

IMO, вы должны найти classRoom по его идентификатору из репозитория, если он новый, вы должны создать новую сущность и сначала сохранить ее. Затем назначьте его пользователю и сохраните. Объект, полученный из метода post, не был создан менеджером объекта.

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

user.getClassRooms().add(newClassRoom); достаточно, user.setClassRooms(user.getClassRooms()); не требуется.

Вы должны будете выполнить операцию каскадного сохранения. Перечислите все каскадные типы явно и не используйте mappedBy, вместо этого используйте аннотацию joincolumns.

...