2017-04-07 1 views
6

Ich bin neu bei Spring Data Rest und versuche, mit seinen grundlegenden Konzepten zu spielen. Bisher läuft alles gut, aber vor ein paar Tagen ist mir aufgefallen, dass die Anwendungsleistung nach der Umsetzung der Projektionen plötzlich nachgelassen hat.Spring Data Rest Hinzufügen von Auszugsprojektion schaltet sich faul holen

Dies sind meine Einheiten, Repositories und der Vorsprung

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

Also, alles hat gut funktioniert, bis ich den Auszug Projektion auf die ItemRepository hinzugefügt @RepositoryRestResource(excerptProjection=ItemExcerpt.class)

Bevor Sie dies tun, wenn ich http://localhost:9191/categories Ausgang Hibernate getroffen wurde wie ich es erwartet habe:

Dies ist die Ausgabe, die ich nach dem Hinzufügenbekomme

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=? 

Meine Schlussfolgerung ist, dass der Auszug Projektion lazy fetching macht auf @OneToMany Beziehung ignoriert wird, was zu einem Leistungsabfall führt. Kennt jemand einen Weg, um dieses Problem zu umgehen, oder ist das vielleicht ein erwartetes Verhalten?

Antwort

0

Es ist nicht genau, dass Auszugsprojektionen faules Holen ignoriert werden. Genauer gesagt ist es so, dass eine Auszugsprojektion Springdaten mitteilt, um die exzerpierten Daten aufzunehmen, wo immer eine Sammelressource zurückgegeben wird. Aus den Referenzdokumenten Projections Excerpts, "Ein Auszug ist eine Projektion, die automatisch auf eine Ressourcensammlung angewendet wird.". Der unglückliche Nebeneffekt davon ist, dass Spring-hateoas diese Eigenschaft dann ignoriert und statt dessen die Hypermedia-Verbindung zu der Ressource einfügt. Es gibt keine Kombination von Anmerkungen, die ich gefunden habe, die dieses Verhalten für Sie korrigieren, während die Ausgabe beibehalten wird. @JsonIgnore wird die zusätzlichen Abfragen nicht verhindern. @RestResource (exported = false) verhindert die Abfragen, verhindert aber auch die Hypermedia-Verbindung.

Verwandte Themen