2016-10-17 7 views
2

私は2つのモデルを持っています。私はREST API(Pet and Media)からデータを取得しようとしています。私はペットとメディアとの間のoneToMany関係を熱心にFetchType.EAGERアノテーションでロードしようとしていますが、MediaRepositoryに書き込むとデータは表示されません。私がそのファイルを実装していないと、メディアの関係とデータが応答に戻ってきます。実装MediaRepository.javaでSpringがFetchType.EAGERを設定してもデータをロードしない

は、GET /ペット返します

{ 
    "id": 72, 
    "name": "Spot", 
    "description": "Annoying as hell", 
    "media": [], <-- why is this here only if I don't implement MediaRepository? 
    ... 
} 

がMediaRepository.java実装しないと、GET /ペットが返されます。

@Entity 
public class Pet implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(name="name") 
    private String name; 

    @Column(name="description") 
    private String description; 

    @OneToMany(cascade=CascadeType.ALL, mappedBy="pet", FetchType.EAGER, orphanRemoval=true) 
    private List<Media> media; 

    @ManyToOne 
    private Category category; 

    @Enumerated(EnumType.STRING) 
    private Status status; 
} 

{ 
    "id": 72, 
    "name": "Spot", 
    "description": "Annoying as hell", 
    ... (No media array in response) 
} 

Pet.javaを

Media.java

@Entity 
public class Media implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(name="url") 
    private String url; 

    @Column(name="title") 
    private String title; 

    @ManyToOne 
    private Pet pet; 
} 

PetRepository.java

import org.springframework.data.jpa.repository.JpaRepository; 

public interface PetRepository extends JpaRepository<Pet, Long> { 
} 

MediaRepository.java

import org.springframework.data.jpa.repository.JpaRepository; 

public interface MediaRepository extends JpaRepository<Media, Long> { 
} 
+0

あなたは春データ休息を使用していますか? –

+0

@AlanHayはい、そうです。 – khchan

+0

あなたはまた、データベースにどのようにマップされているデータベースのテーブル構造を追加することができますか? –

答えて

2

これは、戦略をフェッチ休止状態とは何の関係もありません。

あなたが見ている動作は、Spring Data Restが動作するように設計されていることです。メディアリポジトリを定義すると、クライアントが関連するメディアアイテムを取得するためのリンクがレスポンスに表示されます。リポジトリがなければ、もちろん、コレクションを独立して検索する手段がないため、レスポンスにアソシエーションを組み込む必要があります。

応答で選択的にインラインコレクションを行う場合は、プロジェクションを定義することで可能です。

@Projection(name = "inlineData", types=Pet.class) 
public interface PetProjection{ 

    Long getId(); 
    String getName(); 
    String getDescription(); 
    List<Media> getMedia(); 
} 

あなたはこの投影は、コレクションリソースに自動的に適用されていることができます。

例えば:アイテムのリソースクライアントの場合

@RepositoryRestResource(excerptProjection = PetProjection.class) 
public interface PetRepository extends JpaRepository<Pet, Long> {} 

は通常、彼らはインラインこのデータを望むことを指定します

http://example.com/api/pets/1?projection=inlineData 

http://docs.spring.io/spring-data/rest/docs/current/reference/html/#projections-excerpts

+0

ありがとうございます!これはまさに私が必要としていたものです。 – khchan