我正在尝试学习 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;
}
在 Spring 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 而不是子选择。
在方面文件中,我发现生成的查询负责获取我的数据:
public static List<Fact> Fact.findAllFacts() {
return entityManager().createQuery("SELECT o FROM Fact o", Fact.class).getResultList();
}
如何强制 Spring Roo 使用 join?我做错了什么?
最佳答案
将 FetchType.EAGER
从 ManyToOne 更改为 FetchType.LAZY
。预加载正在获取整个对象图。我非常确定您可以摆脱 @Fetch(FetchMode.JOIN)
注释。
关于java - Spring Roo 生成大量查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915802/