2016-10-08 7 views
2
@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 "WATCH" Movie、Personはプロパティ "movies"を持ち、Movieはプロパティ "person"を持っています。私の目的はPersonをMovie IDで取得することです。 FindOne()が実行された後、結果オブジェクトムービーにサブオブジェクトpersonがあり、サブオブジェクトmovieがあり、エンドレスループに移動するため、/ movieTest APIを呼び出すと例外が発生しました このような状況をどう対処するか、Person Byを映画のIDにする必要があるときに、どうすればいいのでしょうか?エンティティを取得する方法関連するオブジェクトIDによって、springデータneo4jを使用する場合?

答えて

2

まず、モデルを再確認する必要があります。 Cypherでは、(:Person)-[:WATCH]->(:Movie)と言っています。 Javaコードでは、言っている:

  1. 人は、多くの映画を鑑賞することができます。
  2. 映画
  3. は一人で見ることができます。

一般的に、映画は多くの人が見ている可能性がありますか?その場合、ムービークラスは(同じマッピングを使用して)人の集合を保持する必要があります。

0..1Personさんが映画を見ることができる何らかの映画プレビューアプリの場合、他の誰もそれを見ることができない(または更新されて、それを見た最後の人が人です)いくつかのオプション:

  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()

関連する問題