我的问题很简单,但是我不知道如何使Hibernate达到我想要的方式:
-表MainTable具有ParentTable(具有100行)的Many-2-One。 MainTable指向ParentTable中100行中的m = 26行

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID")
@Fetch(FetchMode.JOIN)

当我简单地查询“从MainTable”时

它将生成26 + 1查询

当我跟踪查询时,第一个查询仅加载后来的26个查询使用的PARENT_ID。我想它应该有办法在第一个查询中加载整个PARENT_TABLE。

请通过以下假设来提供帮助:
  • FetchType.EAGER是必须的
  • 使用MainTable的左连接来获取mt.parent父可以,但是我们有很多关联
  • 最佳答案

     // Annotate ParentTable Persistance class file with a batch Size
     @BatchSize(size=100)
     class ParentTable{
         ..
     }
    
    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    

    这将使查询数量减少n/100 + 1。

    出现此问题的原因是, hibernate 状态将在内部以惰性模式获取数据(我不是在谈论FetchMode.Lazy)。可以使用FetchMode.SUBSELECT排除Lazy模式,该模式仅适用于集合。对于@ManyToOne,您可以通过指定batch来选择数据的batchSize

    关于获取开始的简短说明
    FetchMode.SUBSELECT

    FetchMode.SELECT

    FetchMode.JOIN

    FetchType.Batch


    根据应何时执行查询,有两种类型的获取。
    FetchType.EAGER:


    FetchType.LAZY:



    How the Fetch Strategies work is better explained here

    关于Hibernate在多对一中生成m +1个查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11851101/

    10-14 10:44
    查看更多