Spring Roo генерирует много запросов

Я пытаюсь изучить Spring Roo, и я делаю свое маленькое приложение. У меня есть класс продукта:

@RooJavaBean
@RooToString
@RooEntity(table = "TOWARY")
public class Product {
    @Id
    @GeneratedValue
    @Column(name = "ID")
    private int id;

    @Column(name = "NAZWA")
    private String name;

    @Version
    @Column(name = "VERSION")
    private int version;
}

И класс фактов:

@RooJavaBean
@RooToString
@RooEntity(table = "FACTS")
public class Fact {
    @Id
    @GeneratedValue
    @Column(name = "ID")
    private int id;

    @Column(name = "KWOTA")
    private float kwota;

    @Column(name = "NCZAS")
    private int nczas;

    @Version
    @Column(name = "VERSION")
    private int version;

    @NotNull
    @ManyToOne(fetch=FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    @JoinColumn(name="ID_TOWAR")
    private Product product;
}

После того, как Sprinng Roo сотворил волшебство, я запускаю приложение и вижу веб-страницу. Хорошая работа, так мало кода, и он почти работает.
При предварительном просмотре продуктов все работает нормально:

Hibernate: select product0_.ID as ID0_, product0_.NAZWA as NAZWA0_, product0_.VERSION as VERSION0_ from TOWARY product0_
Hibernate: select product0_.ID as ID0_, product0_.NAZWA as NAZWA0_, product0_.VERSION as VERSION0_ from TOWARY product0_ limit ?
Hibernate: select count(product0_.ID) as col_0_0_ from TOWARY product0_ limit ?

Но когда я просматриваю факты, у меня возникает много запросов (в основном по одному для каждой строки таблицы фактов):

Hibernate: select fact0_.ID as ID1_, fact0_.KWOTA as KWOTA1_, fact0_.NCZAS as NCZAS1_, fact0_.ID_TOWAR as ID5_1_, fact0_.VERSION as VERSION1_ from FACTS fact0_
Hibernate: select product0_.ID as ID0_0_, product0_.NAZWA as NAZWA0_0_, product0_.VERSION as VERSION0_0_ from TOWARY product0_ where product0_.ID=?
Hibernate: select product0_.ID as ID0_0_, product0_.NAZWA as NAZWA0_0_, product0_.VERSION as VERSION0_0_ from TOWARY product0_ where product0_.ID=?
Hibernate: select product0_.ID as ID0_0_, product0_.NAZWA as NAZWA0_0_, product0_.VERSION as VERSION0_0_ from TOWARY product0_ where product0_.ID=?
...

После поиска я нашел сообщения «N + 1 выбирает проблему». Я прав — это тоже моя проблема?
Я думал, что @Fetch(FetchMode.JOIN) заставляет спящий режим использовать соединение, а не подзапросы.

В файлах аспектов я нашел сгенерированный запрос, который отвечает за получение моих данных:

public static List<Fact> Fact.findAllFacts() {
    return entityManager().createQuery("SELECT o FROM Fact o", Fact.class).getResultList();
}

Как я могу заставить Spring Roo использовать соединение? Что я делаю неправильно?


person Pawel    schedule 18.01.2012    source источник


Ответы (1)


Измените FetchType.EAGER с ManyToOne на FetchType.LAZY. Нетерпеливая загрузка извлекает весь граф объекта. И я почти уверен, что вы можете избавиться от аннотации @Fetch(FetchMode.JOIN).

person Matt Brock    schedule 19.01.2012
comment
Похоже, мы можем указать эти параметры и с помощью команд roo, здорово! jira.spring.io/browse/ROO-250 - person chrismarx; 14.07.2014