首页 > 解决方案 > 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总是[]

这是快照:

JSON中的空字段spring boot

我有4 个与此映射相关的表:

ManyToMany 空自动表弹簧靴

spring.jpa.hibernate.ddl-auto=create-drop在我的aplication.properties中尝试过

空表:

唯一保存映射的表:

我该如何解决这个问题?

这是所有与ManyToMany映射相关的表:

与多对多弹簧引导相关的表

标签: springhibernatespring-bootjpaspring-data-jpa

解决方案


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);

推荐阅读