Изменения, не отраженные после «обновления» сущности с помощью Spring JPA - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь «обновить» сущность (Foo), которая выглядит следующим образом:

public class Foo {

    //...
    @OneToMany(mappedBy = "fooRef", fetch = FetchType.LAZY)
    private List<Bar> bars;
}


public class Bar {

    //...
    @Column(name = "FOO_ID")
    private Long fooRef;
    @Column(name = "STATE")
    @Enumerated(EnumType.STRING)
    private State state;
}

Поскольку Spring JPA не реализует метод обновления , я просто запрашиваюсущность снова.Это код, который не работает, и я не знаю, почему:

for(int i=0; i<MAX_RETRIES; i++) {

    List<Bar> bars = foo.getBars();

    // check bars state

    if(someBarIsBad) {
        try {
            TimeUnit.SECONDS.sleep(delay);
        } catch (InterruptedException ignored) {

        }
    } else {
        break;
    }

    foo = fooRepo.findById(fooId);  // "refresh"
}

Цель состоит в том, чтобы продолжить повторную попытку, пока все бары не будут иметь желаемое состояние.Тест, который я делаю, - это установка точки останова в последней инструкции цикла, поэтому, когда она прерывается, я беру таблицу и изменяю состояние всех баров на желаемое, чтобы затем выйти из цикла.Дело в том, что новый вернул foo, bars не отражает изменения, которые я сделал.

Я пытался снять сон, но это не проблема.Я думаю, что это должно быть что-то с отображением.

1 Ответ

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

Это наиболее вероятно, потому что все выполняется в одной транзакции.Это заставляет JPA не перезагружать сущность из базы данных, а возвращать ту, которая уже есть в сеансе.

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

...