Mapstruct多对一映射

问题描述 投票:2回答:1

我对mapstruct中的@ManyToOne映射有疑问。我有两张桌子

第一个:

@Entity
@Table(name = "members", schema = vsm)
public class MemberEntity{

    @Column(name = "id", nullable = false)
    protected Long id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "case_id", nullable = false)
    private CaseEntity case;
}

和第二个:

@Entity
@Table(name = "cases", schema = vsm)
public class CaseEntity {

    @Column(name = "id", nullable = false)
    protected Long id;

    @Column(name = "description", nullable = false)
    protected String description;
}

而且我有一个这样的案例dto:

public class CasesDto{

    protected Long id;

    protected String description;

    private List<MemberDto> members;
}

并且MemberD与实体相同。

我需要使用mapstruct进行这样的映射:

CasesDto mapToDto(CaseEntity entity);

而且我需要填写列表成员;但我不明白如何。

java hibernate entity dto mapstruct
1个回答
0
投票

您不能仅以此方式将其映射到CasesD。没有要映射到List<MemberDto>的集合。您应该完全组成包括以下内容的CaseEntity:

  @OneToMany(mappedBy = "cases")
  private List<MemberEntity> members = new ArrayList<>();

为了避免最坏情况的N + 1问题(stackOverflow N+1),您应该正确配置JPA(以.yml为例),这将允许您由ORM执行1 + Math.ceil({MembersAmount}/{default_batch_fetch_size})查询:

spring:
  jpa:
    properties:
      hibernate:
        jdbc:
          batch_size: 50
        default_batch_fetch_size: 50

或通过其他查询获取成员列表,并以这种方式将其合并到Mapstruct中(我认为是更差的选择:]

  @Mapping(target = "members", source = "members")
  CasesDto toDto(CaseEntity entity, List<MemberEntity> members);
© www.soinside.com 2019 - 2024. All rights reserved.