我使用JPA和Hibernate实现。我的问题可能是经验丰富的hibernate用户的基本问题:基于Hibernate一级缓存编写查询的最有效方式是什么?使用休眠高速缓存的高效查询
例如,我有实体A
和实体B
:
@Entity
class A{
private int ida;
private int x;
private String s;
@OneToMany(mappedBy = "ida", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<B> Bset;
}
@Entity
class B{
private int ida;
private String s2;
}
假设我有几个流可能在同一会话发生:
- 得到
A.x
- 得到整个
A
实体 - 检查是否
A
包含B
与s2="..."
;
对于这些疑问,我可以
- 编写获得通过
ida
A.x
/B
和特定查询的每一个s2
或 - 假设休眠节省缓存,并始终得到
A
对象,或A.Bset()
然后java循环内部获得所需的B
Bset()
什么是最有效的方法?
谢谢
谢谢你,解决了我的一些用例。如果一旦我需要一个B行,我会推荐什么?我需要整个Bset? 我认为,提前抓取会为A.Bset逐一带来B行。 – lili
不,预先提取实际上是用来防止逐个提取(臭名昭着的N + 1问题)。随着渴望的提取,Hibernate会为你创建一个JOIN查询,并用一个SQL同时提取所有'B'的'A'。 –
这是使用@FetchMode(JOIN) –