【发布时间】:2015-12-14 22:10:07
【问题描述】:
我使用 Spring Data Neo4j 4 GraphRepository 来保存和检索数据。使用 GraphRepository save() 和 findAll() 方法。
当我将现有实体属性更新为 null 时,更改似乎不会反映在返回的数据中。
如果我将属性更新为任何其他非空值,则更改会正确反映。
我可以看到在数据库服务器上执行了空属性更新。但是 findAll() 方法不反映更改并保留旧值。
这是一个已知的错误吗?任何解决方法?还是某种缓存问题?
更新
在尝试了解会发生什么之后,我发现当您为同一个实体有两个不同的 Java 对象时会出现此问题。 null 属性永远不会被更新(但其他具有非 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);
}
真实案例:当使用带有 Spring MVC 表单的 SDN 时,看起来实体是从模型属性创建的。当表单中的值设置为 null 时,在 Neo4j 中会正确执行更新,但使用任何 find...() 方法时不会正确返回值。因此会导致数据过时。
旁注:当 Neo4J 会话范围是每个“会话”时会发生此问题,而当会话范围是每个“请求”时不会发生此问题。
@Bean
@Override
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
return super.getSession();
}
【问题讨论】:
标签: spring-mvc neo4j spring-data-neo4j-4