spring - Spring Boot 字段未更新
问题描述
在我的User
课堂上,我有这个:
@ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private List<ClassRoom> classRooms = new ArrayList<>();
在我的ClassRoom
课堂上,我有这个:
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
private List<User> admins = new ArrayList<>();
现在在我的UserController
课堂上,我有:
@PostMapping("user/{id}/c")
User addClassRoom(@PathVariable Long id,@RequestBody ClassRoom newClassRoom)
{
return repository.findById(id)
.map(user -> {
user.getClassRooms().add(newClassRoom);
return repository.save(user);
})
.orElseGet(() -> {
return null;
});
}
当我发布这个curl -X POST -H "Content-Type: application/json" -d "{ }" http://localhost:8080/user/{id}/c
admins
提交的User
总是[]
这是快照:
我有4 个与此映射相关的表:
我spring.jpa.hibernate.ddl-auto=create-drop
在我的aplication.properties中尝试过
空表:
CLASSROOM_ADMINS
CLASSROOM_USER
CLASS_ROOM_ADMINS
唯一保存映射的表:
USER_CLASS_ROOMS
我该如何解决这个问题?
这是所有与ManyToMany
映射相关的表:
解决方案
你newClassRoom
还需要user
像这样添加存在:newClassRoom.getAdmins().add(user);
更新
我已经修复并承诺,现在应该可以工作了。
什么问题
堆栈溢出错误是由于 JSON 序列化 - 它与 JPA 持久性无关 - 它发生是因为User
并且ClassRoom
相互引用。为了解决这个问题,我标记了该字段admins
以@JsonIgnore
打破循环引用。
解决方案仍然不是最优的,因为用户是在事务边界之外获得的,因此处于分离模式。因此,该repository.save
方法被迫合并user
到持久化上下文中。为了避免这种开销,我使用事务方法创建了一个服务来封装所有内容(第二次提交)。
顺便提一句
Java中有一些代码约定(比如包名是小写等)。请检查Google Java 样式代码
这是Service
:
/**
* @author Eugen Covaci {@literal eugen.covaci.q@gmail.com}
* Created on 10/8/2019
*/
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public User addClassRoom(Long userId, ClassRoom newClassRoom) {
return userRepository.findById(userId)
.map(user -> {
user.getClassRooms().add(newClassRoom);
newClassRoom.getAdmins().add(user);
return userRepository.save(user);
})
.orElseGet(() -> {
return null;
});
}
}
并在Controller
使用中:
return userService.addClassRoom(id, newClassRoom);
推荐阅读
- neo4j - PROFILE 和 EXPLAIN 在 cypher-shell 上没有显示任何内容
- image-processing - 透明度去除 Imagemagick 不使用展平方法
- c++ - 如何在使用 OpenCV C++ 应用 K 均值后将分割提取为图像?
- android - 从 sqlite 获取数据到回收站视图
- ruby - 使用 jruby 会导致“Errno::EBADF: Bad file descriptor”错误
- system-verilog - $urandom的NBA任务
- hyperledger-fabric - 链码实例化期间“允许的最小内存限制为 4MB”失败
- listview - Flutter 在列表视图中显示网格视图
- php - 无法获得异步执行的 ReactPHP 承诺
- mosquitto - 它在服务器上同时支持多少个客户端 vernemq 或 mosquitto?