Spring引导字段未更新

Spring引导字段未更新,spring,hibernate,spring-boot,jpa,spring-data-jpa,Spring,Hibernate,Spring Boot,Jpa,Spring Data Jpa,在我的User课程中,我有: @ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL) private List<ClassRoom> classRooms = new ArrayList<>(); @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER) private List<User> admins = new A

在我的
User
课程中,我有:

@ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private List<ClassRoom> classRooms  = new ArrayList<>();
@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-xpost-H“内容类型:application/json”-d“{}”http://localhost:8080/user/{id}/c

用户的
管理员
字段始终是
[]

以下是快照:

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

我在application.properties中尝试了
spring.jpa.hibernate.ddl auto=create drop

空表:

  • 教室管理员
  • 教室用户
  • 教室管理员
仅包含映射的表:

  • USER\u CLASS\u房间
我如何解决这个问题

以下是与
manytomy
映射相关的所有表格:


新建教室
上,您还需要添加现有的
用户
,如下所示:
新建教室.getAdmins().add(用户)

更新

我已经固定并承诺,现在应该工作了

出了什么问题

堆栈溢出错误是由于JSON序列化引起的-它与JPA持久性无关-发生此错误的原因是
User
chool
相互引用。为了解决这个问题,我用
@JsonIgnore
标记了字段
admins
,以打破循环引用


不过,解决方案不是最优的,因为用户是在事务边界之外获得的,因此处于分离模式。因此,
repository.save
方法被迫将
user
合并到持久性上下文中。为了避免这种开销,我使用事务方法创建了一个服务来封装所有内容(第二次提交)

顺便说一句

Java中有一些代码约定(比如包名是小写的等等)。请查收

这是
服务

/**
* @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;
            });
}
}
控制器中使用以下命令:

return userService.addClassRoom(id, newClassRoom);

请注意您的
数据源.url
?是文件类型吗?我不知道你的第一张照片是什么意思。它与您的
用户控制器#addClassification
的url映射不同。如果要检查控制器,请在浏览器路径中输入
http://localhost:8080/user/1/c
带有请求正文参数@윤현구
datasource.url=jdbc:h2:file:~/spring-boot-h2-db
我不明白第二条评论,你能为
USER\u CLASS\u ROOMS
USER
school
表发布DML吗?我肯定那不会起作用,因为那会创建一个循环。。。
casscade
fetch
不应该为我这样做吗?试试看,它不会创建循环。看,我已经试过了。@MaifeeUlAsad不是这样的。您只有
存储库.save
方法上的事务,这意味着
user
在查找后被分离。使用事务性方法创建一个服务类,并将所有3行代码放在该事务性方法的clojure中。@MaifeeUlAsad ecovaci