Синхронизация объектов гибернации - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь обновить объект с помощью Hibernate и ищу разъяснения, как это работает. Код выглядит следующим образом:

public void updateReadingCompRecall(ReadingCompRecall rcr) {
    ReadingCompRecall oldRecall = getReadingCompRecall(rcr.getId());
    oldRecall.setNotes(rcr.getNotes());
    if(rcr.getQuestionRecall() != null && !rcr.getQuestionRecall().isEmpty()) {
        if(oldRecall.getQuestionRecall() == null ) {
            List<ReadingCompQuestionRecall> newList = new ArrayList<>();
            rcr.getQuestionRecall().forEach(qr -> {factory.getCurrentSession().save(qr);
                                                                                        newList.add(qr);});
            oldRecall.setQuestionRecall(newList);
        }else {
            rcr.getQuestionRecall().forEach(qr -> {factory.getCurrentSession().save(qr);
                                                                                        oldRecall.getQuestionRecall().add(qr);});
        }
    }

public ReadingCompRecall getReadingCompRecall(long compKey) {
    ReadingCompRecall rcr = null;
    rcr  = factory.getCurrentSession().get(ReadingCompRecall.class , compKey);
    return rcr;
}

Объект «ReadingCompRecall» имеет список типа «ReadingCompQuestionRecall», который отображается в другую таблицу в отношении «один ко многим» с типом выборки LAZY. Я передаю недавно обновленный объект ReadingCompRecall и хочу обновить его список типа «ReadingCompQuestionRecall». Итак, я начинаю с проверки, есть ли у объекта ReadingCompRecall нулевой список. Однако вызов get в этом списке пытается получить список из базы данных, что, очевидно, приведет к исключению LazyInitializationException. Если я получаю список из базы данных с помощью Hibernate, я получаю старый список, который еще не обновлялся. Я новичок в Hibernate, поэтому не уверен, есть ли правильный способ сделать это или нет. Любой совет будет очень признателен. Примечание: в этой ситуации в прошлом я просто передал фактический список типа «ReadingCompQuestionRecall» вместо объекта, который содержит список. Это позволяет мне проверять наличие null и пусто без вызова DB, однако код будет намного аккуратнее, если я просто передам полный объект, так как у него есть три других списка, которые также необходимо синхронизировать. Это работает только что в списках, но я искал что-то попроще. Спасибо, ребята.

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