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 方法不更新数据的主要内容,如果未能解决你的问题,请参考以下文章