Остановить рекурсию из двунаправленных однозначных сопоставлений - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть объект UserProfile, который содержит ссылку на объект TwitchAccount через отношение один к одному, как показано здесь:

TwitchAccount.java:

@OneToOne(mappedBy = "twitchAccount")
private UserProfile profile;

UserProfile.java:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "twitchAccountId", referencedColumnName = "twitchAccountId")
private TwitchAccount twitchAccount;

Когда я выполняю запрос GET для определенного объекта TwitchAccount, кажется, что между ними наблюдается рекурсия:

{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":{"id":8,"firstName":null,"lastName":null,"profilePicUrl":null,"birthday":null,"steamId":null,"xblId":null,"psnId":null,"epicId":null,"discordId":null,"twitchAccount":{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":{"id":8,"firstName":null,"lastName":null,"profilePicUrl":null,"birthday":null,"steamId":null,"xblId":null,"psnId":null,"epicId":null,"discordId":null,"twitchAccount":{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":{"id":8,"firstName":null,"lastName":null,"profilePicUrl":null,"birthday":null,"steamId":null,"xblId":null,"psnId":null,"epicId":null,"discordId":null,"twitchAccount":{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":{"id":8,"firstName":null,"lastName":null,"profilePicUrl":null,"birthday":null,"steamId":null,"xblId":null,"psnId":null,"epicId":null,"discordId":null,"twitchAccount":{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":{"id":8,"firstName":null,"lastName":null,"profilePicUrl":null,"birthday":null,"steamId":null,"xblId":null,"psnId":null,"epicId":null,"discordId":null,"twitchAccount":{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":{"id":8,"firstName":null,"lastName":null,"profilePicUrl":null,"birthday":null,"steamId":null,"xblId":null,"psnId":null,"epicId":null,"discordId":null,"twitchAccount":{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":{"id":8,"firstName":null,"lastName":null,"profilePicUrl":null,"birthday":null,"steamId":null,"xblId":null,"psnId":null,"epicId":null,"discordId":null,"twitchAccount":{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":{"id":8,"firstName":null,"lastName":null,"profilePicUrl":null,"birthday":null,"steamId":null,"xblId":null,"psnId":null,"epicId":null,"discordId":null,"twitchAccount":{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":{"id":8,"firstName":null,"lastName":null,"profilePicUrl":null,"birthday":null,"steamId":null,"xblId":null,"psnId":null,"epicId":null,"discordId":null,"twitchAccount":{"id":1,"state":"525367bb-ca4c-4131-ac52-e29aafdb7dc1","code":null,"userProfile":

Как я могу остановить эту рекурсию,и как я могу сделать так, чтобы учетная запись twitch даже не возвращала json, связанный с объектом профиля пользователя (объект учетной записи twitch не должен иметь возможность устанавливать или получать профиль пользователя в любом случае)?

1 Ответ

1 голос
/ 13 апреля 2019

Вы можете просто аннотировать свойство profile с помощью @JsonIgnore, например,

@JsonIgnore
@OneToOne(mappedBy = "twitchAccount")
private UserProfile profile;

Но это определенно не очень хорошая практика, потому что таким образом вы продолжаете выставлять объекты, что является ошибкой, а такжепотому что у вас, вероятно, возникнет проблема, когда вам потребуется предоставить UserProfile.

Итак, создайте DTO для обеих сущностей, а в их соответствующих Сервисах создайте методы преобразования, и все готово, вы контролируете то, что вы установили.


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

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

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