【问题标题】:Spring Boot many to many post method not updating dataSpring Boot 多对多 post 方法不更新数据
【发布时间】:2020-02-04 01:52:52
【问题描述】:

我的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 中。

这里有什么问题?我该如何解决这个问题?

【问题讨论】:

    标签: spring spring-boot jpa spring-data-jpa many-to-many


    【解决方案1】:

    使用user.getClassRooms().add(newClassRoom);

    我们必须使用userRepository.save(user);

    【讨论】:

      【解决方案2】:

      IMO 你必须通过它的 id 从存储库中找到 classRoom,如果它是新的,你必须先创建一个新实体并保存它。然后将其分配给用户并保存。 您从 post 方法收到的对象不是由实体管理器创建的。

      【讨论】:

        【解决方案3】:

        user.getClassRooms().add(newClassRoom); 就足够了,user.setClassRooms(user.getClassRooms()); 不需要。

        您必须执行级联保存操作。明确列出所有级联类型,不要使用 mappedBy,而是使用 joincolumns 注释。

        【讨论】:

          【解决方案4】:

          请贴一下日志好吗? Hibernate 是否在您的表中进行任何插入?是否在数据库中正确创建了数据库模式?我建议您做的一件事是在 User 类的顶部添加一个自定义表名称,使用如下注释:@Table(name = "users")。在大多数 SQL 方言中,user 是保留关键字,因此建议始终对 User 类进行一些不同的注释,这样 Hibernate 为该实体创建表时不会有任何问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-05-30
            • 2018-07-11
            • 1970-01-01
            • 2020-07-17
            • 2015-12-05
            • 1970-01-01
            • 2021-07-07
            • 2015-02-21
            相关资源
            最近更新 更多