Сохранение сущности завершается неудачно с ненулевым ограничением.Весна-загрузка - PullRequest
0 голосов
/ 16 мая 2018

У меня есть сущности 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.

Как получилось? И как это можно исправить?

1 Ответ

0 голосов
/ 16 мая 2018

Это проблема двунаправленных отношений JPA. Обновление одного направления отношений (в вашем случае School.users) не обновляет автоматически противоположное направление отношений (в вашем случае User.school). Вам необходимо сделать это явно.

Чтобы сохранить их, вам нужно пройтись по списку пользователей и установить поле школы в желаемую школу.После этого инициализируйте список пользователей в школе и сохраните.Примерно так:

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

Кстати, я бы посоветовал взглянуть на вопрос двунаправленных отношений JPA.После некоторого исследования вы, скорее всего, придете к выводу, чтобы избежать его как можно больше.Лично мне пришлось использовать только несколько двунаправленных отношений JPA в моей карьере.В подавляющем большинстве случаев однонаправленных отношений достаточно для ваших нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...