Я пытаюсь выучить 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? Что я делаю не так?