我有实体User
和School
。 在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);
一切都很好,数据正在保存到school
和user
表中。
但
我需要将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关系。在绝大多数情况下,单向关系足以满足您的需求。