2017-04-07 70 views
6

我是Spring Data Rest的新手,並嘗試使用它的基本概念。到目前爲止,一切運行良好,但幾天前我注意到,在將預測投入商業後,應用性能突然下降。春天的數據休息添加摘錄投影關閉懶惰提取

這些都是我的實體,資料庫和投影

@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(); 
} 

因此,所有工作得很好,直到我加入了摘錄投影到ItemRepository @RepositoryRestResource(excerptProjection=ItemExcerpt.class)

這樣做之前,當我打http://localhost:9191/categories休眠產量正如我預期的那樣:

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

這是我在添加後得到的輸出excerptProjection=ItemExcerpt.class

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,「摘錄是自動應用於資源集合的投影。」。這種不幸的副作用是,spring-hateoas忽略該屬性,而是將超媒體鏈接放入資源中。沒有註釋的組合,我發現它會在保留輸出的同時爲您糾正這種行爲。 @JsonIgnore不會阻止額外的查詢。 @RestResource(exported = false)將阻止查詢,但也會阻止超媒體鏈接。