Необязательный @OneToOne и обновление не работает - PullRequest
0 голосов
/ 09 октября 2019

У меня есть случай, когда объект LiveStreamInformation может принадлежать к TwitchAccount, YoutubeAccount или Mixer Account. В действии объект LiveStreamInformation будет принадлежать только одному из этих объектов учетной записи. Это сопоставления, которые я установил, но когда я предварительно выполняю такие операции, как:

TwitchAccount account = findById(id);
account.setLiveStreamInformationObject(info);
update(account);

Изменение не выполняется (но происходит молча). Вот отрывки того, как настраиваются отображения гибернации:

TwitchAccount:

public class TwitchAccount {
    @OneToOne(mappedBy = "twitchAccount", cascade = CascadeType.ALL)
    private LiveStreamInformation liveStreamInformation;
}

LiveStreamInformation:

public class LiveStreamInformation {

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

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "liveStreamInformationId", referencedColumnName = "liveStreamInformationId")
    private MixerAccount mixerAccount;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "liveStreamInformationId", referencedColumnName = "liveStreamInformationId")
    private YoutubeAccount youtubeAccount;
}

Обратите внимание, что YoutubeAccount и MixerAccount имеют одинаковую точную структуру /отображение как TwitchAccount (только с соответствующим mappedBy)

Вот пример того, как мы пытаемся установить информационный объект живого потока для учетной записи

if (info != null) {
    LiveStreamInformationResponseDto dto = info.convertToResponseDto();
    dto.setUser(f.getFollows().convertToResponseDto());
    liveStreams.add(dto);
    // add/update to db for future checks
    persisted = liveStreamInformationService.create(info);
    twitchAccount.setLiveStreamInformation(persisted);
    update(twitchAccount);
}

Метод обновления выглядит следующим образом (и работает в любом другом случае в моем приложении)

@Override
public void update(final T entity) {
    Preconditions.checkNotNull(entity);

    getDao().save(entity);
}

Я предполагаю, что мой вопрос заключается в том, есть ли у меня настройки сопоставлений, поскольку это действительно @OneToOne или @OneToNone (который не существует), и почему это не такобновление правильно?

1 Ответ

1 голос
/ 09 октября 2019

Вам необходимо установить twitchAccount в экземпляре LiveStreamInformation:

persisted = liveStreamInformationService.create(info);
persisted.setTwitchAccount(twitchAccount);// Here is the new line
twitchAccount.setLiveStreamInformation(persisted);
update(twitchAccount);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...