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