2017-04-07 3 views
6

私はSpring Data Restを初めて使用し、その基本的な概念を試してみようとしています。これまでのところすべてうまくいきましたが、数日前に私は、予測をビジネスに入れた後にアプリケーションのパフォーマンスが突然低下したことに気付きました。Springデータ抜粋投影を追加して残りの部分を遅延読み込みオフにする

これらは私のエンティティ、リポジトリと投影されている

@Entity 
public class Item { 

    @Id 
    @GeneratedValue(strategy = TABLE) 
    private long id; 

    private String code; 

    private String name; 

    @ManyToOne(targetEntity=Category.class) 
    @JoinColumn(name="category_id", referencedColumnName="id") 
    private Category category; 

    //getters & setters 
} 

@Entity 
public class Category { 

    @Id 
    @GeneratedValue(strategy = TABLE) 
    private long id; 

    private String name; 

    @OneToMany(mappedBy="category", targetEntity=Item.class, fetch=FetchType.LAZY) 
    private Set<Item> items; 

    //getters & setters 
} 

@RepositoryRestResource(excerptProjection=ItemExcerpt.class) 
public interface ItemRepository extends CrudRepository<Item, Long>{ 

} 

@RepositoryRestResource 
public interface CategoryRepository extends CrudRepository<Category, Long>{ 

} 

@Projection(name="excerpt", types=Item.class) 
public interface ItemExcerpt { 

    String getName(); 
} 

だから、すべてがそれまではうまく働いた私はhttp://localhost:9191/categories Hibernateの出力を打ったとき、私は、これを行う前にItemRepository @RepositoryRestResource(excerptProjection=ItemExcerpt.class)

に抜粋投影を添加し、私はそれがために期待通り:

select 
     category0_.id as id1_0_, 
     category0_.name as name2_0_ 
    from 
     category category0_ 

これは私がを追加した後に取得する出力であります

Hibernate: 
    select 
     category0_.id as id1_0_, 
     category0_.name as name2_0_ 
    from 
     category category0_ 
Hibernate: 
    select 
     items0_.category_id as category4_1_0_, 
     items0_.id as id1_1_0_, 
     items0_.id as id1_1_1_, 
     items0_.category_id as category4_1_1_, 
     items0_.code as code2_1_1_, 
     items0_.name as name3_1_1_ 
    from 
     item items0_ 
    where 
     items0_.category_id=? 

私の結論は、抜粋の投影は、パフォーマンスの低下につながる@OneToMany関係、上無視されて遅延フェッチを作るということです。 誰もがこの問題を回避する方法を知っていますか、これはおそらく予想される動作ですか?

答えて

0

抜粋の投影によって、レイジーフェッチが無視されるわけではありません。より具体的には、コレクションのリソースが返されるたびに抜粋されたデータを含むように抜粋投影がスプリングデータに指示していることです。 参照文書からProjections Excerpts「抜粋は、自動的にリソースコレクションに適用される予測です。」。この不都合な副作用は、春の嫌悪者がそのプロパティを無視し、代わりにリソースへのハイパーメディアリンクに置き換えられることです。出力を保存している間にこの動作を修正するアノテーションの組み合わせはありません。 @JsonIgnoreは余分なクエリを防止しません。 @RestResource(exported = false)はクエリを防止しますが、ハイパーメディアリンクも防止します。

関連する問題