Hibernates加载整个层次结构,即使某些字段是惰性的
在JPQL中使用get-to-lazy-load属性或使用fetch-join时,我可以更全面地了解lazy-load类的整个层次结构,即使它的一些字段也是lazy的 该应用程序使用: -弹簧靴 -spring数据jpa 2.1.6 -hibernate核心5.3.9 -我们的观点是错误的 -龙目岛2.1Hibernates加载整个层次结构,即使某些字段是惰性的,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
@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
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.