@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时我应该怎么做?
答案 0 :(得分:2)
首先,我们需要仔细检查模型。在Cypher,你说的是(:Person)-[:WATCH]->(:Movie)
。在您的Java代码中,您说:
一般来说,很多人都可以观看电影吗?如果是这种情况,电影类应该拥有一组人(具有相同的映射)。
如果它是某种电影预览应用程序,其中0..1
Person
可以观看电影,一旦观看就没有其他人可以观看它(或者它会更新,所以最后一个观看它的人是那个人)然后你有几个选择:
您可以向存储库添加自定义查询:
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);
}
回归关系意味着你的人物对象应该与观看的电影保持一致。
只需使用findOne
方法检索电影,然后从中获取该人:movie.getPerson()