我正在尝试使用spring数据休息服务创建一个如何在neo4j中删除关系的示例。您可以使用neo4j-movies-example进行测试。
如果我获得有关人1的信息,我看到有一部电影
curl -s http://localhost:8080/persons/1
{
"name" : "Keanu Reeves",
"born" : 1964,
"_links" : {
"self" : {
"href" : "http://localhost:8080/persons/1"
},
"person" : {
"href" : "http://localhost:8080/persons/1"
},
"movies" : {
"href" : "http://localhost:8080/persons/1/movies"
}
}
}
更改实体后仍然存在以下关系:
curl -s -X PUT -H "Content-Type:application/json" -d '{ "name" : "Keanu Reeves", "born":1964, "movies": [] }' http://localhost:8080/persons/1
{
"name" : "Keanu Reeves",
"born" : 1964,
"_links" : {
"self" : {
"href" : "http://localhost:8080/persons/1"
},
"person" : {
"href" : "http://localhost:8080/persons/1"
},
"movies" : {
"href" : "http://localhost:8080/persons/1/movies"
}
}
}
即使curl -s -X DELETE http://localhost:8080/persons/1/movies
也无效。那么我怎样才能删除neo4j与spring-data-rest的关系?
[更新1]我试图将其追踪,但以Issue - >结尾修复了HashSet和HashCode-Method的问题。
[更新2]创建了一个example,表明Neo4j-OGM工作正常,但Spring Data会遇到麻烦。 - >已修复 - 问题是缺少@Transactional
,因此每次调用存储库时,都会创建一个新的事务和会话。对于更新,加载和保存必须在同一事务中。
[更新3]解决了其他问题后,我能够理解这个问题。在PATCH-Request中,对象在不同的会话中加载,然后是save-method。行为如下,对象在会话[412]中加载,对象以预期的方式被操纵,然后对象被保存在会话[417]中。
答案 0 :(得分:2)
有一个设置可以在Spring Boot application.properties中启用OpenSessionInViewInterceptor:
spring.data.neo4j.open-in-view=true
这仅适用于常规控制器,而不适用于Spring Data REST资源。
您可以提供以下配置来启用Spring Data REST的拦截器(在任何@Configuration
类中):
@Bean
public OpenSessionInViewInterceptor openSessionInViewInterceptor() {
return new OpenSessionInViewInterceptor();
}
@Bean
public MappedInterceptor myMappedInterceptor() {
return new MappedInterceptor(new String[]{"/**"}, openSessionInViewInterceptor());
}