Spring Data CrudRepository возвращает только измененные поля при вызове save () - PullRequest
0 голосов
/ 17 октября 2018

Я использую Spring Data (версия 1.13.9.RELEASE) и у меня CrudRepository называется myRepository.Я звоню myRepository.save(myObject), чтобы перезаписать существующий экземпляр myObject в базе данных, и я указываю некоторые поля myObject как null.

Например:

{
    "prop1": "val1",
    "prop2": null,
    "prop3": "val3"
}

Когда я вызываю myRepository.save(myObject) и читаю возвращаемое значение, все поля myObject, которые я установил как null, возвращаются как null (поэтому prop2 в этом примере).

Однако значение для prop2 в базе данных НЕ null после вызова save() - оно все еще имеет предыдущее значение, прежде чем я вызвал save().

Это именно то поведение, которое мне нужно в данной конкретной ситуации (игнорировать null значения при вызове myRepository.save()), но я бы хотел, чтобы возвращаемое значение save() отражало то, чтофактически в базе данных после операции, вместо того, чтобы возвращать только обновленные поля и поля установки, заданные как null - null или их значение по умолчанию (например, false в случае логического значения.

Это ожидаемое поведение CrudRepository save() поведения?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Это означает, что транзакция еще не завершена и все изменения находятся только в кеше.Для принудительного обновления вы можете вызвать entityManager.flush() или переместить всю необходимую логику в отдельный открытый метод другого Сервиса или Менеджера и аннотировать его как @Transactional

0 голосов
/ 17 октября 2018

Чтобы понять проблему, вам нужно немного понять Hibernate Object Lifecycle.

Жизненный цикл объекта Hibernate состоит из следующих состояний: 1. Переходное состояние 2. Постоянное состояние 3. Отдельное состояние и т. Д.

Когда вы создаете новый объект, он находится в переходном состоянии, и Hibernate не имеетсредство обнаружения объектов, присутствующих / созданных в переходном состоянии.

Когда вы вызываете save() saveOrUpdate(), тогда объект переходит из переходного состояния в постоянное состояние, и теперь Hibernate начнет отслеживать все изменения, внесенные в объект (но объект еще не записан вthe db).

Так что в вашем случае, поскольку объект не находится в постоянном состоянии, hibernate не сможет его распознать и сработает (скорее всего) insert запрос.Однако, если объект уже находился в постоянном состоянии, hibernate знал бы, что некоторые поля были изменены, и, следовательно, запускает запрос update.

Именно поэтому вам необходимо убедиться, что объект находится в постоянном состоянии.укажите, хотите ли вы, чтобы Hibernate запускал запрос update.

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