如何在使用spring数据neo4j时通过相关的对象id获取实体?

时间:2016-10-08 04:39:10

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

@NodeEntity    
public class Person {
  @GraphId private Long nodeId;
  private String name;
  private String addr;
  private int age;

  @Relationship(type="WATCH")
  private Set<Movie> movies;
}


@NodeEntity
public class Movie{
  @GraphId private Long nodeId;
  private String title;
  private int released;


  @Relationship(type="WATCH" ,direction = Relationship.INCOMING)
  private Person person;

  public Movie(){}
}


@RequestMapping(value = "/movieTest", method = RequestMethod.GET)
public Movie movieTest(){
    Movie movie =movieRepository.findOne(5078L,1);
    return movie;
}
public interface MovieRepository extends GraphRepository<Movie> {
}

我创建了一个Person类和一个Movie类,Person&#34; WATCH&#34;电影,人有财产&#34;电影&#34;,电影有财产&#34;人&#34;,我的目的是通过电影ID获取人,但是&#34; java.lang.StackOverflowError&# 34;当我调用/ movieTest API时发生异常,因为在执行了findOne()之后,结果对象影片中有一个子对象的人,而且有一个子对象的电影,然后进入无限循环,    所以我想知道如何处理这种情况,或者当我需要通过电影ID获取Person时我应该怎么做?

1 个答案:

答案 0 :(得分:2)

首先,我们需要仔细检查模型。在Cypher,你说的是(:Person)-[:WATCH]->(:Movie)。在您的Java代码中,您说:

  1. 一个人可以看很多电影:
  2. 一个人可以观看电影。
  3. 一般来说,很多人都可以观看电影吗?如果是这种情况,电影类应该拥有一组人(具有相同的映射)。

    如果它是某种电影预览应用程序,其中0..1 Person可以观看电影,一旦观看就没有其他人可以观看它(或者它会更新,所以最后一个观看它的人是那个人)然后你有几个选择:

    1. 您可以向存储库添加自定义查询:

      public interface PersonRepository extends GraphRepository<Person> {
          @Query("MATCH (n:Person)-[r]->(m:Movie) WHERE ID(m) = {movieId} RETURN r")
          Person findByMovieId(@Param("movieId) Long id);
      }
      

      回归关系意味着你的人物对象应该与观看的电影保持一致。

    2. 只需使用findOne方法检索电影,然后从中获取该人:movie.getPerson()