Я использую Spring Data Neo4j 4 GraphRepository для сохранения и извлечения данных. Использование методов GraphRepository save() и findAll().
Когда я обновляю существующее свойство сущности до нуля, кажется, что изменения не отражаются в возвращаемых данных.
Если я обновлю свойство до любого другого значения, отличного от null, изменения отразятся правильно.
Я вижу, что обновление нулевого свойства выполняется на сервере БД. Но метод findAll() не отражает изменения и сохраняет старое значение.
Это известная ошибка? Любое обходное решение? Или это какая-то проблема с кэшированием?
ОБНОВЛЕНИЕ
Попытавшись понять, что происходит, я обнаружил, что эта проблема возникает, когда у вас есть два разных объекта Java для одной и той же сущности. Свойство null никогда не будет обновлено (но будут обновлены другие свойства с ненулевыми значениями).
Пример кода:
@Autowired
MovieRepository repository;
public void test() {
repository.deleteAll();
Movie movie1 = new Movie();
movie1.setName("Pulp Fiction");
movie1.setDirector("Quentin Tarantino");
movie1 = repository.save(movie1);
System.out.println("Movie1: " + movie1);
Movie movie2 = new Movie();
movie2.setId(movie1.getId());
movie2.setName(movie1.getName());
movie2.setDirector(null); // implicit...
movie2 = repository.save(movie2);
System.out.println("Movie2: " + movie2);
Movie movie3 = repository.findOne(movie1.getId());
System.out.println("Movie3: " + movie3);
}
Реальный случай: при использовании SDN с формой Spring MVC кажется, что сущности создаются из атрибутов модели. Когда в форме установлено значение null, обновление выполняется правильно в Neo4j, но значения не возвращаются правильно при использовании любых методов find...(). Поэтому это приводит к устаревшим данным.
Примечание: эта проблема возникает, когда область сеанса Neo4J соответствует «сеансу», и не возникает, когда область сеанса соответствует «запросу».
@Bean
@Override
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
return super.getSession();
}