使用CrudRepository延迟加载

时间:2018-12-29 23:58:51

标签: java hibernate spring-boot jackson lazy-loading

我有一个简单的父子关系(一对多)。我正在两个方面检索父母。一个获得父母名单,一个获得单亲父母。在列表上,我不想序列化每个父母的孩子列表。我只想在有单亲父母时显示孩子名单。

我正在使用Spring Boot和CrudRepository。 我尝试过

spring.jpa.open-in-view=false
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

也是fetch = FetchType.LAZY,最后,我用FETCH关键字编写了自定义HQL。

父模型

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private List<Child> children;

子模型

@Column(name = "parent_id")
@JsonIgnore
private Long parentId;

父存储库

 public interface ParentRepository extends CrudRepository<Parent, Long> 

家长服务

List<Parent> findAll() {
    return StreamSupport
            .stream(repository.findAll().spliterator(), false)
            .collect(Collectors.toList());
}

正如我所说,我有时会序列化这种关系中的孩子列表,在某些情况下不是。

3 个答案:

答案 0 :(得分:0)

很可能是由于View中的默认打开会话。从2.0版开始

如果您在application.properties配置文件的下面添加了行,那么它将正常工作

spring.jpa.open-in-view=false

答案 1 :(得分:0)

您可以使用带有Jackson的JsonView或JsonFilter来执行此操作。另一个选择是分离问题,即使用DTO来控制实体的序列化视图。 这是有关某些Jackson功能的教程的链接:https://www.baeldung.com/jackson-serialize-field-custom-criteria

答案 2 :(得分:0)

好的,我终于做到了。我为没有孩子的父母写了一份专门的HQL。

    @Query("SELECT new Parent(a.parentId, a.name, a.address, a.city) FROM Parent a WHERE a.otherId= :id")
List<Parent> findAllBySomeOtherIdWithoutChildren(@Param("id") Long id);

看来这是最快的方法。感谢您的所有建议。