2012-01-18 47 views
1

我正在嘗試學習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袋鼠做了它的魔力,我開始申請,我看到的網頁。工作很好,代碼很少,幾乎可以工作。
在做的產品預覽它的正常工作:

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的使用加入?我做錯了什麼?

回答

0

FetchType.EAGER從ManyToOne更改爲FetchType.LAZY。急切加載正在獲取整個對象圖。我很確定你可以擺脫@Fetch(FetchMode.JOIN)註釋。

+0

不錯。它完美的作品。謝謝。 – Pawel 2012-01-19 08:43:20

+0

看起來像我們可以用roo命令指定這些選項,太棒了! https://jira.spring.io/browse/ROO-250 – chrismarx 2014-07-14 19:06:02