【问题标题】:Spring data lazy load not workingSpring数据延迟加载不起作用
【发布时间】:2018-07-14 20:55:24
【问题描述】:

我有两个类似于下面的实体:

@Entity
@DynamicUpdate    
public class EntityOne {
    @Id
    public long id;

    public String name;
    public String displayName;

    @JsonManagedReference
    @OneToMany(mappedBy = "id", cascade = CascadeType.ALL)
    @OrderBy(value = "name")
    public List<EntityTwo> entityTwoList;
}

实体二是

@Entity
@DynamicUpdate
public class EntityTwo {
    @Id
    public long id;

    @JsonBackReference
    @ManyToOne
    @JoinColumn(name = "id")
    public EntityOne entityOne;
}

服务: Lists.newArrayList(repository.findAll());

服务调用 CRUDRepository 的 findAll() 方法。我不希望在调用 findall() 时加载实体两个对象的列表,但此解决方案不起作用。 我在这里做的任何不正确的事情都是为了延迟加载集合。我基本上不希望在指定之前加载集合。

默认情况下,映射是延迟加载的。

【问题讨论】:

  • Jackson 正在尝试获取这个未获取的对象。
  • @surya 是的,正是 JsonManagedReference 注释使 Spring 加载所有内容

标签: java hibernate jpa spring-boot spring-data


【解决方案1】:

我假设 jackson 正在尝试加载您的子对象。

尝试followjackson-datatype-hibernate4:2.4.4 将 jackson-datatype-hibernate4:2.4.4 添加到您的依赖项并定义以下 bean

@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
return new Jackson2ObjectMapperBuilder()
    .modulesToInstall(Hibernate4Module.class);
}

【讨论】:

    【解决方案2】:

    我不了解 jackson,但根据 jpa 规范,您不能强制延迟加载,也不能依赖它......您只需提供延迟加载提示,完全取决于提供者是否延迟加载(与 EAGER 不同,它强制加载)

    【讨论】:

      【解决方案3】:

      首先试试这个,我认为你需要指定获取类型为惰性或急切

         ManyToOne(fetch= FetchType.LAZY)
      

      【讨论】:

      • @surya ManyToOne 默认为 EAGER!而 OneToMany 是 LAZY readTheDocs
      • 你是对的,我可能误读了这里的答案,实际上我的意思是onetomany,默认是lazy.anyway我认为这个解决方案行不通。因为在问题中,用户说他正在尝试加载对象并且不想加载集合 Bd 这不是其他方式。
      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 2019-01-18
      相关资源
      最近更新 更多