用neo4j休息弹簧数据:如何删除关系

时间:2017-07-04 13:44:41

标签: neo4j spring-data-rest spring-data-neo4j spring-data-neo4j-4

我正在尝试使用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]中。

1 个答案:

答案 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());
}