Spring Boot 多对多 post 方法不更新数据

Posted

技术标签:

【中文标题】Spring Boot 多对多 post 方法不更新数据【英文标题】:Spring Boot many to many post method not updating data 【发布时间】: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 ="clas-s-room_user",
            joinColumns = @JoinColumn(name = "clas-s-room_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 (),我发现我的用户没有任何变化。 Clas-s-room 或空的 Clas-s-room 不会添加到 User 中。

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

【问题讨论】:

【参考方案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 为该实体创建表时不会有任何问题。

【讨论】:

以上是关于Spring Boot 多对多 post 方法不更新数据的主要内容,如果未能解决你的问题,请参考以下文章

多对多 Spring Boot JPA 未填充多对多表

Spring-boot JPA无限循环多对多

Spring Boot 多对多 GET 请求

Spring Boot 中的多对多映射问题

Spring boot - 多对多关联不删除连接表数据

Spring Boot中两个实体之间的多对多关系