Побочный эффект метода save () в Spring-data JpaRepository - PullRequest
4 голосов
/ 12 марта 2020

Я заметил очень странное поведение с save(T entity) в JpaRepository данных пружины.

У меня есть объект Foo foo, и я пытаюсь сохранить его в репозитории fooRepository.save(foo). Моя проблема в том, что после сохранения экземпляр foo, который я передаю методу save(), изменяется. Я не ожидаю этого, и мне очень странно, что я не могу найти никакой проблемы, связанной с этим.

Это ожидаемое поведение?

1 Ответ

6 голосов
/ 12 марта 2020

Мы можем попытаться понять ваши наблюдения, сначала проверив Javado c для CrudRepository :

Сохраняет данную сущность. Используйте возвращенный экземпляр для дальнейших операций , поскольку операция сохранения могла полностью изменить экземпляр сущности.

Одним из возможных объяснений здесь является то, что при сохранении некоторый другой поток или процесс имели также изменил базовый объект. Вот что на самом деле делает метод save():

@Transactional
@Override
public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);   // <-- this is your use case
    }
}

Он вызовет em.merge(), который будет возвращаться с любыми новыми изменениями, внесенными в запись / сущность в базе данных. Итак, вам следует проверить, что еще может обновлять эту сущность в фоновом режиме.

...