Java JPA - связь OneToOne разрывается после обновления

У меня есть две таблицы (объекты) с именами User и Profile в JPA, которые синхронизируются с базой данных MySQL. Связь между ними OneToOne и двунаправленная.

Вот как я сделал отношение в модели:

Пользователь:

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
private Profile profile;

Профиль:

@OneToOne(cascade = CascadeType.ALL, mappedBy = "profile", optional = false)
private User user;

Я создаю REST API, и моя проблема в том, что я обновляю профиль по его идентификатору с контроллера.

Прежде чем обновлять данные в Profile, я могу использовать getUser из этого профиля.

После обновления данных в Profile (с помощью profileService.update(profile);) я не могу использовать getUser для этого профиля.

Похоже, что отношения были нарушены.

В базе данных нет USER_ID в таблице Profile, только таблица «Пользователь» имеет столбец PROFILE_ID.

Отношение работает нормально, пока я его не обновлю.

Можете ли вы создать Минимальный, полный и проверяемый пример? Наличие большего количества кода может помочь нам найти, что не так, но слишком много кода может быть вредным.

dquijada 27.12.2018 17:46

@dquijada Я знаю, но не могу опубликовать даже минимальный пример. Он будет очень большим, потому что его большой проект Spring REST

Baterka 27.12.2018 17:47

Вы проверяли, сохраняется ли связь в базе данных? Это может быть пример того, как вы непреднамеренно изменили данные перед вызовом .update.

dquijada 27.12.2018 17:51

В таблице @dquijada «Пользователь» все еще установлен «PROFILE_ID». Но перестает работать в другом направлении

Baterka 27.12.2018 17:53

Можете ли вы поделиться кодом того, как вы обновляете сущность?

Aditya Narayan Dixit 27.12.2018 18:04

Минимально полный и проверяемый пример - это не «весь код вашего проекта». Это минимальный, полный и проверяемый пример, то есть что-то минимальное, но завершенное, воспроизводящее проблему.

JB Nizet 27.12.2018 18:29

@JBNizet Я знаю, но насколько возможно ядро, модель и безопасность REST могут быть достаточно минималистичными, чтобы включить их в сообщение

Baterka 27.12.2018 18:44

REST и безопасность не имеют ничего (или, по крайней мере, не должны иметь ничего общего) с вашей проблемой. По мере того, как вы это описываете, вы получаете профиль и обновляете его. Для этого вам не нужен REST или безопасность. Написание этого минимального примера поможет вам выяснить или, по крайней мере, точно определить, в чем проблема.

JB Nizet 27.12.2018 18:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
66
1

Ответы 1

Я исправил проблему. Это было вызвано тем, что перед обновлением пользователь не был настроен в профиль, потому что «dao.update ()» просто заменяет данные, а не обновляет их.

Другие вопросы по теме