我使用hibernate spring-data-jpa和querydsl进行分页,并使用@BatchSize(size = 10)只进行一次数据库往返.
@Entity
@Table(name = "appel_offre",catalog = "ao")
public class AppelOffre implements java.io.Serializable {
....
@OnetoMany(fetch = FetchType.LAZY,mappedBy = "appelOffre")
@BatchSize(size=10)
public Set
并且:
@Entity
@Table(name = "ao_activite",catalog = "ao")
public class AoActivite implements java.io.Serializable {
.....
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_ACTIVITE",nullable = false)
@BatchSize(size=10)
public Activite getActivite() {
return this.activite;
}
我的查询
JPAQuery query = new JPAQuery(entityManager).from(ao)
.leftJoin( ao.acheteur,ach ).fetch()
.leftJoin( ao.aoActivites,ao_ac )
.leftJoin( ao_ac.activite,ac )
.offset(...).limit(...).list(..);
但是在日志中有很多往返数据库:
1 - round-trip
.....
Hibernate: select ... from ao.ao_activite aoactivite0_ where aoactivite0_.ID_APPEL_OFFRE in (?,?,?)
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
2 - round-trip
.....
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
3 - round-trip
.....
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
4 - round-trip
.....
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
5 - round-trip
.....
6 - round-trip
.....
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
7 - round-trip
......
8 - round-trip
.....
Hibernate: select ... from ao.activite activite0_ where activite0_.ID_ACTIVITE=?
9 - round-trip
.....
10 - round-trip
>一对多和
>多对一
就多对一而言,我们必须在@Entity级别上应用它(在我们的情况下,在Activite类的映射上)
@Entity
@BatchSize(size=25)
@Table(name = "activite" ...
public class Activite implements java.io.Serializable {
...
在doc中查看(下面附带的小引号):
…
Batch fetching for classes/entities is easier to understand. Consider the following example: at runtime you have 25 Cat instances loaded in a Session,and each
Cat
has a reference to its owner,a Person. ThePerson
class is mapped with a proxy,lazy=”true”. If you Now iterate through all cats and callgetowner()
on each,Hibernate will,by default,execute 25 SELECT statements to retrieve the proxied owners. You can tune this behavior by specifying a batch-size in the mapping of Person:
…
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。