实体保存失败,但未出现空约束.弹簧靴



我有实体UserSchool。 在MySQL数据库中,它们之间有一个外键(一所学校有很多用户(。

User我有:

@ManyToOne(optional = false, targetEntity = School.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "schoolId", referencedColumnName = "id", nullable = false)
private School school;

School我有:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = User.class)
@JoinColumn(name = "schoolId")
private List<User> users;

当我想保存School包含List<User>的实体时,我调用

schoolRepository.save(school);

一切都很好,数据正在保存到schooluser表中。

我需要将not null constraint添加到user.school_id列(我使用它liquibase(,当我这样做并尝试再次保存实体School时,我收到:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'school_id' cannot be null.

怎么来了?如何修复?

这是双向 JPA 关系的问题。更新关系的一个方向(在您的情况下School.users(不会自动更新相反的关系方向(在您的例子中User.school(。您需要明确执行此操作。

为了保存它们,您需要遍历用户列表并将学校字段设置为所需的学校。之后初始化学校中的用户列表并保存。像这样:

users.stream().forEach(user -> user.setSchool(school));
school.setUsers(users);
schoolRepository.save(school);   

顺便说一句,我建议谷歌一下双向 JPA 关系的影响。经过一些研究,您很可能会得出结论,以尽可能避免它。就我个人而言,在我的职业生涯中,我不得不只使用少数双向JPA关系。在绝大多数情况下,单向关系足以满足您的需求。

最新更新