spring 数据与 neo4j 有关:如何删除关系
spring data rest with neo4j: How to remove relationship
我正在尝试创建一个示例,说明如何使用 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 数据造成了麻烦。 -> 已修复 - 问题是缺少 @Transactional
,因此每次调用存储库时,都会创建一个新的事务和会话。对于更新,加载和保存必须在同一个事务中。
[更新3] 解决其他问题后,我能够理解问题所在。在 PATCH-Request 中,对象加载到与保存方法不同的会话中。行为如下,对象在会话 [412] 中加载,以预期方式操作对象,然后对象保存在会话 [417] 中。
在 Spring 启动 application.properties:
中有启用 OpenSessionInViewInterceptor 的设置
spring.data.neo4j.open-in-view=true
这仅适用于常规控制器,不适用于 Spring 数据 REST 资源。
您可以提供以下配置以启用 Spring Data REST 的拦截器(在任何 @Configuration
class 中):
@Bean
public OpenSessionInViewInterceptor openSessionInViewInterceptor() {
return new OpenSessionInViewInterceptor();
}
@Bean
public MappedInterceptor myMappedInterceptor() {
return new MappedInterceptor(new String[]{"/**"}, openSessionInViewInterceptor());
}
我正在尝试创建一个示例,说明如何使用 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 数据造成了麻烦。 -> 已修复 - 问题是缺少 @Transactional
,因此每次调用存储库时,都会创建一个新的事务和会话。对于更新,加载和保存必须在同一个事务中。
[更新3] 解决其他问题后,我能够理解问题所在。在 PATCH-Request 中,对象加载到与保存方法不同的会话中。行为如下,对象在会话 [412] 中加载,以预期方式操作对象,然后对象保存在会话 [417] 中。
在 Spring 启动 application.properties:
中有启用 OpenSessionInViewInterceptor 的设置spring.data.neo4j.open-in-view=true
这仅适用于常规控制器,不适用于 Spring 数据 REST 资源。
您可以提供以下配置以启用 Spring Data REST 的拦截器(在任何 @Configuration
class 中):
@Bean
public OpenSessionInViewInterceptor openSessionInViewInterceptor() {
return new OpenSessionInViewInterceptor();
}
@Bean
public MappedInterceptor myMappedInterceptor() {
return new MappedInterceptor(new String[]{"/**"}, openSessionInViewInterceptor());
}