Java 懒惰抓取不适用于多对一

Java 懒惰抓取不适用于多对一,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我有一个类a与B有一对多的关系,当我想要获取B时,我不想要获取a,这意味着我想要一个延迟获取,在这种情况下,我的代码看起来好像没有编写setter和getter方法 @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) @Generated("org.jsonschema2pojo

我有一个类a与B有一对多的关系,当我想要获取B时,我不想要获取a,这意味着我想要一个延迟获取,在这种情况下,我的代码看起来好像没有编写setter和getter方法

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true)
@Generated("org.jsonschema2pojo")
@Entity
public class B{

  @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
  @JoinColumn(name = "aId")
  private A a;
}


@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true)
@Generated("org.jsonschema2pojo")
@Entity
public class A  {

  @OneToMany(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  private Set<B> bs;
}

问题是,我得到了一个无限递归,其中B包含A,A包含B,等等,我尝试在manytone使用@JsonBackReference,在OneToMany使用@JsonManagedReference,这解决了递归问题,但抓取仍然是渴望而不是懒惰的。另外,我不想使用@JsonIgnore,因为我的观点是不发送另一个查询来获取A。

您是如何检查是否仍在急切地进行获取的?虽然默认情况下ToOne关系是急切的,但是延迟抓取应该可以与ManyToOne一起使用-您确定没有看到N+1选择吗?如果没有,您可以向我们展示您正在使用的查询吗?我猜对象是通过反射和使用getter序列化的。这就是为什么总是提取对象。也许您可以创建一个中间模型,其中包含来自实体的值并省略惰性属性,然后用JSON序列化。@Thomas是的,我看到N+1选择!我认为这是一个急切的抓取No,它是懒惰的抓取,这意味着在访问A时会抓取对A的引用,而Jackson肯定正在这样做。@Thomas是在一个查询中执行的急切抓取吗?还有,如何避免杰克逊这样做?它为什么要这么做!