Hibernates加载整个层次结构,即使某些字段是惰性的

Hibernates加载整个层次结构,即使某些字段是惰性的,hibernate,spring-boot,spring-data-jpa,Hibernate,Spring Boot,Spring Data Jpa,在JPQL中使用get-to-lazy-load属性或使用fetch-join时,我可以更全面地了解lazy-load类的整个层次结构,即使它的一些字段也是lazy的 该应用程序使用: -弹簧靴 -spring数据jpa 2.1.6 -hibernate核心5.3.9 -我们的观点是错误的 -龙目岛2.1 @Entity @Audited @Builder @Data @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstru

在JPQL中使用get-to-lazy-load属性或使用fetch-join时,我可以更全面地了解lazy-load类的整个层次结构,即使它的一些字段也是lazy的

该应用程序使用: -弹簧靴 -spring数据jpa 2.1.6 -hibernate核心5.3.9 -我们的观点是错误的 -龙目岛2.1

@Entity
@Audited
@Builder
@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class BT{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Setter(AccessLevel.NONE)
    private Long id;
    @ManyToMany
    private Set<PT> pt;
    @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL)
    private Set<ST> s;

@Entity
@Audited
@Builder
@Data
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ST{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Setter(AccessLevel.NONE)
    private Long id;
    private Integer checkIntervalOffline;
    @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
    private B b;
}


@Entity
@Audited
@Builder
@Data
@NoArgsConstructor(access = AccessLevel.PUBLIC  )
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class B{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Setter(AccessLevel.NONE)
    private Long id;
    @OneToMany(cascade = CascadeType.ALL)
    private Set<P> p;
}


@Entity
@Audited
@Builder
@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class P{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Setter(AccessLevel.NONE)
    private Long id;
    @OneToMany(cascade = CascadeType.ALL)
    private Set<F> features;
}


@Entity
@Audited
@Builder
@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class F{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Setter(AccessLevel.NONE)
    private Long id;
    private String value;
}
我只希望得到与订阅相关的查询: 1.对于获取连接:

select bt.id as id1_13_0_, s.id as id1_57_1_, si2_.b_id as b_11_57_1_, 
from bt bt0_ 
inner join bt_st si1_ on bt0_.id=si1_.bt_id 
inner join st si2_ on si1_.s_id=si2_.id

  • 为了得到类似的东西
  • Bun实际上,我得到了很多其他实体的额外查询:

    select b_.id as id1_2_0_ from b b0_ where b0_.id=?
    select p0_.b_id as b_i1_6_0_, p0_.p_id as p2_6_0_, p1_.id as id1_35_1_product1_.pt_id as p_5_35_1_
    from bp p0_ 
    inner join p p1_ on p0_.p_id=p1_.id 
    where p0_.b_id=?
    and also for f
    ```
    
    So somehow spring jpa tries to get the entire dependency tree for me ignoring the lazy.
    

    不,我打赌不是。您的代码、JSON序列化程序或XML序列化程序使用实体并在关联中导航,这就是触发关联(延迟)加载的原因。旁注:通过将类重命名为单字母或双字母类名,使代码不正确且完全不可读。请不要这样做。执行查询并对结果完全不做任何操作,我打赌您不会看到其他查询。更改为不做任何操作:
    public List getAllBTWithS(){BTRepository.findAllWithS();return List.of();}
    `@query(value=“SELECT b FROM BT b LEFT JOIN FETCH b.s”)List findAllWithS();` 但是附加的查询仍然存在。您是否使用调试器来进行此实验?如果是这样,不要。谢谢@JBNizet,我解决了问题。它是Lombok,默认情况下会生成包含所有字段的哈希代码,并且会强制延迟加载。不,我打赌不会。您的代码、JSON序列化程序或XML序列化程序使用实体并在关联中导航,这就是触发关联(延迟)加载的原因。旁注:通过将类重命名为单字母或双字母类名,使代码不正确且完全不可读。请不要这样做。执行查询并对结果完全不做任何操作,我打赌您不会看到其他查询。更改为不做任何操作:
    public List getAllBTWithS(){BTRepository.findAllWithS();return List.of();}
    `@query(value=“SELECT b FROM BT b LEFT JOIN FETCH b.s”)List findAllWithS();` 但是附加的查询仍然存在。您是否使用调试器来进行此实验?如果是这样,不要。谢谢@JBNizet,我解决了问题。它是Lombok,默认情况下会生成包含所有字段的哈希代码,并强制延迟加载。
    select bt.id as id1_13_0_, s.id as id1_57_1_, si2_.b_id as b_11_57_1_, 
    from bt bt0_ 
    inner join bt_st si1_ on bt0_.id=si1_.bt_id 
    inner join st si2_ on si1_.s_id=si2_.id
    
    
    select b_.id as id1_2_0_ from b b0_ where b0_.id=?
    select p0_.b_id as b_i1_6_0_, p0_.p_id as p2_6_0_, p1_.id as id1_35_1_product1_.pt_id as p_5_35_1_
    from bp p0_ 
    inner join p p1_ on p0_.p_id=p1_.id 
    where p0_.b_id=?
    and also for f
    ```
    
    So somehow spring jpa tries to get the entire dependency tree for me ignoring the lazy.