当前位置: 首页 > 面试题库 >

@BatchSize,但在获取@ManyToOne关联时有许多往返

彭建业
2023-03-14
问题内容

我将分页与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<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(..);

但是在日志中有很多往返数据库的行程:

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
  • Many-to-One 以及

以防万一Many-To-One,我们必须在@Entity级别上应用它(在我们的Activite类映射中)

@Entity
@BatchSize(size=25)
@Table(name = "activite" ...
public class Activite implements java.io.Serializable {
...

在doc中检查它 下面附加小引用)

[20.1.5。使用批量提取](http://docs.jboss.org/hibernate/orm/4.3/manual/en-

US/html_single/#performance-fetching-batch)

批量获取类/实体更容易理解。考虑以下示例:在运行时,您在一个Session中加载了25个Cat实例,并且每个实例Cat都引用了其所有者Person。在Person类的映射使用了代理服务器,为lazy
=“真”。如果您现在遍历所有的猫并调用getOwner()它们,默认情况下,Hibernate将执行25条SELECT语句以检索代理的所有者。您可以通过在Person映射中指定一个批处理大小来调整此行为:

<class name="Person" batch-size="10">...</class>



 类似资料:
  • 问题内容: 我将分页与休眠的spring-data-jpa和querydsl一起使用,并且我只用于数据库一次往返。 和: 我的查询 但是在日志中有很多往返数据库的行程: 问题答案: 该两个有道理 和 以及 以防万一,我们必须在级别上应用它(在我们的类映射中) 在doc中检查它 ( 在 下面附加小引用) : [20.1.5。使用批量提取](http://docs.jboss.org/hibernat

  • 问题内容: 我在一些旧代码中发现了奇怪的事情(至少对我而言)。 带注释的字段也用注释。 我一直以为注释仅在类级别或集合()上进行注释时才受影响,而在迭代时则影响 预取 。 但是,也许我错了,并标注与影响的东西。我在文档中找不到答案。 是否标注有有感觉? 问题答案: 仅当相应字段标记为()时,与关联的内容才有意义。 的确,如果该字段不是,则根据定义,由于装入了实体,因此该字段已经被加载,因此数据库调

  • 问题内容: 我这样做是为了对实体对象进行延迟加载: 我想与多个延迟加载的集合返回一个实体对象 加载的 ,我能做到这一点(通过在列表中,并设置超过联想单个标准是什么?): 问题答案: 是? 该文档包含以下内容: 该查询将通过外部联接获取伴侣和小猫。有关更多信息,请参见第20.1节“获取策略”。

  • 我正在为实体对象上的延迟加载集合执行此操作: 我想返回一个实体对象,其中加载了多个延迟加载的集合,我可以这样做吗(传入一个列表并为单个条件设置多个关联?):

  • 根据这篇文章,我正在尝试反序列化与JooQ的一对多关联(没有代码生成)。 这是我的目标课程。 我的JooQ查询如下: 方法无法按预期工作。生成的SQL语句如下所示: 翻译后的postgres查询没有正确替换的key属性,这会导致SQL异常。 PS:我正在使用JooQ 3.14.0和postgres 11.5

  • 我在将带有@ManyToOne关系的实体(雇员)映射到带有@OneToMany关系的实体(社区)时遇到了问题。 当我将一个实体(社区)分配给一个实体(员工),其中社区的值为空时,它工作正常。 问题出现了,如果雇员已经为社区分配了价值。当我更改该值并保存更改时,该员工为社区获得了新的值,并且这个新社区在集合中获得了该员工。唯一的问题是,老社区仍然有这个员工在收集,但它应该被删除。这只有在数据库重新启