Spring Boot ManyToMany - StackOverflow - JPA, Hibernate - PullRequest
0 голосов
/ 07 октября 2019

В моем приложении Spring Boot у меня есть класс с именем 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_admins",
            joinColumns = @JoinColumn(name = "classroom_id"),
            inverseJoinColumns = @JoinColumn(name = "user_id"))
    private List<User> admins = new ArrayList<>();
}

В моем ClassRoomController у меня есть такой метод:

@PostMapping("/class")
ClassRoom newClassRoom(@RequestBody User user) {
    ClassRoom classRoom=new ClassRoom();
    classRoom.getAdmins().add(user);
    user.getClassRooms().add(classRoom);
    logger.debug(classRoom);
    logger.debug(user);
    return repository.save(classRoom);
}

Теперь я отправил curl -X POST -H "Content-Type: application/json" -d "{ \"userID\":\"22\" }" http://localhost:8080/class

Этот запрос, и он дает мне ошибку, говоря: java.lang.StackOverflowError

Я должен использовать ToString.Exclude |JsonBackReference |@JsonManagedReference или что-то в этом роде, не уверен, что правильно, лучше всего, что я должен использовать?

В моем 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);
                newClassRoom.getAdmins().add(user);
                return repository.save(user);
            })
            .orElseGet(() -> {
                return null;
            });
}

И я выложил это curl -X POST -H "Content-Type: application/json" -d "{ }" http://localhost:8080/user/2/c

Это создало запись в ClassRoom, но User имеет [] ClassRoom, а ClassRoom имеет [] admins и таблицу CLASSROOM_USERтоже пусто.

Как мне решить эту проблему?

Полная консоль здесь .

Ответы [ 2 ]

2 голосов
/ 07 октября 2019
ClassRoom classRoom = new ClassRoom();
classRoom.getAdmins().add(user);
return repository.save(classRoom);

Не устанавливайте classRooms для пользователя. Он будет назначен автоматически.

Или наоборот, в основном просто выполните одно назначение, так как Hibernate будет обрабатывать данные отношения «многие ко многим» в таблицах.

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

классная комната имеет полевых администраторов (список), и у каждого пользователя есть полевая классная комната. классная комната загружает пользователя и пользователя загружает классную комнату, поэтому возникла ошибка StackOverflowError. Вы должны использовать somting, как аннотацию @JsonIgnore в классе User в поле admins.

...