Spring Roo генерирует много запросов - PullRequest
1 голос
/ 18 января 2012

Я пытаюсь выучить 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) заставляет hibernate использовать join, а не subselect.

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

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

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

1 Ответ

0 голосов
/ 19 января 2012

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

...