首页 > 解决方案 > Neo4j 保存@Relationship 数据

问题描述

这是 MVCE:https ://github.com/neo4j-examples/movies-java-spring-data-neo4j 如果您将一项测试更改为:

@Test
public void testFindByTitle() {
String title = "The Matrix";
Movie result = movieRepository.findByTitle(title);

Person p = personRepository.findByName("Keanu Reeves");

assertNotNull(result);
assertEquals(1999, result.getReleased());
}

您可以在调试模式下看到该对象p没有任何movies.

Person实体是:

@NodeEntity
public class Person {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private int born;

    @Relationship(type = "ACTED_IN")
    private List<Movie> movies = new ArrayList<>();

    public Person() {
    }

    public Person(String name, int born) {
        this.name = name;
        this.born = born;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getBorn() {
        return born;
    }

    public List<Movie> getMovies() {
        return movies;
    }
}

这是来自 neo4j 的官方示例。我怎样才能在数据库中存储实体并Person拥有实体?moviesMovieroles

编辑:我能做的是添加Person实体方法:

public void addMovie(Movie movie) {
   if (this.movies == null) {
      this.movies = new ArrayList<>();
   }
   this.movies.add(movie);
}

并在测试中添加:

p.addMovie(matrix);
personRepository.save(p);

但我不喜欢这样 - 因为我从两个站点手动设置它。

标签: javahibernatespring-bootneo4j

解决方案


您无需从两侧手动设置参考。将您的代码片段稍微扩展一行movie.setPerson(this);,您就完成了:

  public void addMovie(@NotNull Movie movie) {
    if (this.movies == null)
      this.movies = new ArrayList<>();

    this.movies.add(movie);
    movie.setPerson(this);
  }

推荐阅读