2017-04-07 43 views
6

Jestem nowy w Spring Data Rest i staram się bawić podstawowymi pojęciami. Wszystko działa dobrze, ale kilka dni temu zauważyłem, że wydajność aplikacji nagle spadła po wprowadzeniu prognoz do biznesu.Wiosenne dane Spoczywaj, dodając projekcję wykluczeń leniwego pobierania

To są moje jednostki, repozytoria i projekcja

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

Tak, wszystko działało dobrze aż dodałem projekcję wypis do ItemRepository @RepositoryRestResource(excerptProjection=ItemExcerpt.class)

Przedtem, kiedy uderzę http://localhost:9191/categories hibernacji wyjście było jak się spodziewałem, że będzie:

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

jest to wyjście, które otrzymuję po dodaniu 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=? 

Mój wniosek jest taki, że projekcja fragment sprawia leniwe sprowadzanie ignorowane na @OneToMany relacji, co prowadzi do spadku wydajności. Czy ktoś wie, jak ominąć ten problem, czy może jest to oczekiwane zachowanie?

Odpowiedz

0

To nie jest dokładnie to, że projekcje fragmentów powodują ignorowanie leniwego pobierania. Mówiąc dokładniej, projekcja fragmentu mówi wiosennym danym, aby zawierała wyciągnięte dane wszędzie tam, gdzie zwróconoby zasób kolekcji. Z dokumentów referencyjnych Projections Excerpts, "Fragment to rzutowanie, które jest automatycznie stosowane do kolekcji zasobów.". Niefortunnym efektem ubocznym tego jest fakt, że wiosenne hateoidy ignorują tę właściwość i zamiast tego umieszczają link hipermedia do zasobu. Nie ma kombinacji adnotacji, które znalazłem, które poprawią to zachowanie dla ciebie przy zachowaniu danych wyjściowych. @JsonIgnore nie zapobiegnie dodatkowym zapytaniom. @RestResource (exported = false) zapobiegnie zapytaniom, ale zapobiegnie także połączeniu hipermedialnemu.