2017-04-07 1 views
6

Je suis nouveau à Spring Data Rest et essaie de jouer avec ses concepts de base. Tout fonctionne bien jusqu'à présent, mais il y a quelques jours, j'ai remarqué que la performance de l'application a soudainement chuté après la mise en œuvre des projections.Spring Data Rest ajout d'une projection d'extrait éteint la recherche paresseuse

Ce sont mes entités, les référentiels et la projection

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

Donc, tout a bien fonctionné jusqu'à ce que j'ajouté la projection extrait du ItemRepository @RepositoryRestResource(excerptProjection=ItemExcerpt.class)

Avant de le faire, quand je frappe http://localhost:9191/categories Hibernate sortie était comme je m'y attendais:

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

C'est la sortie que j'obtiens après avoir ajouté 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=? 

Ma conclusion est que la projection d'un extrait fait d'être ignoré paresseux fetching sur les relations @OneToMany, ce qui conduit à une baisse de performance. Est-ce que quelqu'un connaît un moyen de contourner ce problème ou est-ce un comportement attendu?

Répondre

0

Il n'est pas exactement que les projections extraites fassent ignorer la récupération paresseuse. Plus précisément, une projection d'extrait indique aux données de printemps d'inclure les données extraites chaque fois qu'une ressource de collecte serait renvoyée. A partir des documents de référence Projections Excerpts, "Un extrait est une projection appliquée automatiquement à une collection de ressources.". L'effet secondaire malheureux de ceci est que le printemps-hateoas alors ignore cette propriété et place plutôt dans le lien hypermédia à la ressource à la place. Il n'y a aucune combinaison d'annotations que j'ai trouvées qui corrigera ce comportement pour vous tout en préservant la sortie. @JsonIgnore n'empêchera pas les requêtes supplémentaires. @RestResource (exported = false) empêchera les requêtes, mais empêchera également le lien hypermédia.