@BatchSize但在@ManyToOne案例中有很多往返 [英] @BatchSize but many round trip in @ManyToOne case
问题描述
我使用hibernate spring-data-jpa和querydsl进行分页,并使用 @BatchSize(size = 10)
只进行一次数据库往返。
I use pagination with hibernate spring-data-jpa and querydsl and i use @BatchSize(size=10)
to make just one round-trip to the database.
@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<AoActivite> getAoActivites() {
return this.aoActivites;
}
和:
@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(..);
但是在日志中有很多往返数据库:
but in the log got many round trip to the database:
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
推荐答案
@BatchSize
对两者都有意义
-
一对多
和 -
多对一
以及
One-To-Many
andMany-to-One
as well
仅限多对一
,我们必须在 @Entity
级别上应用它(在我们的情况下,映射 Activite
class)
Just in case of Many-To-One
, we have to apply it on @Entity
level (in our case on mapping of the Activite
class)
@Entity
@BatchSize(size=25)
@Table(name = "activite" ...
public class Activite implements java.io.Serializable {
...
在doc 中查看(下面附有小引号):
...
...
批量提取类/实体更容易明白了。请考虑以下示例:在运行时,您在会话中加载了25个Cat实例,并且每个 Cat
都有对其所有者的引用,即Person。 Person
类使用代理映射,lazy =true。如果您现在遍历所有猫并在每个猫上调用 getOwner()
,默认情况下,Hibernate将执行25个SELECT语句来检索代理所有者。您可以通过在Person的映射中指定批量大小来调整此行为:
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. The Person
class is mapped with a proxy, lazy="true". If you now iterate through all cats and call getOwner()
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:
<class name="Person" batch-size="10">...</class>
...
...
这篇关于@BatchSize但在@ManyToOne案例中有很多往返的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!