当您只有id时创建Map实体

w8f9ii69  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(270)

老实说,我不知道如何表达问题的标题,如果有人有建议,请让我知道。
我的用例是这样的,我有一个实体,它的帐户属性是这样的(这是为了避免混乱而清理的):

@Entity
@Table(name = "report_line", schema = "public")
public class ReportLine extends BaseReportLine {
  @ManyToOne
  @JoinColumn(name = "report_id")
  private Report report;

  @ManyToOne
  @JoinColumn(name = "account_id")
  private Account account;
}

但只有帐户id/不同属性的dto:

public class ImportLineDto {
  public String groupName;
  public Integer position;
  public Integer parentPosition;
  public String accountId;
  public String name;
  public BigDecimal amount;
  public List<ImportLineDto> lines = new ArrayList<>();
}

我需要检查/展平所有行,以便将其保存到jpa存储库,但有两个问题:
有没有一种方法可以只使用accountid创建表行对象,而不必查找每行的帐户,因为这将添加大量不必要的db调用。
展平后,我应该如何处理每个表对象上的“线”?我应该将它们设置为空/空列表吗?
有更好的方法吗?这一次,我真的可以修改代码了
以下是我到目前为止的情况:

private void saveReport(ImportedResult result) {
    Report report = new Report();
    ...
    report.setLines(getReportLinesFromDtoLines(result.lineItems.lines));
    ReportRepository.saveAndFlush(report);
  }

  private List<ReportLine> getReportLinesFromDtoLines(ImportLineDto lines) {
    List<ImportLineDto> flatLines = flatMapRecursive(lines).collect(Collectors.toList());
    List<ReportLine> reportLines = new ArrayList<>();

    for(ImportLineDto line: flatLines) {
      ReportLine reportLine = new ReportLine();
      reportLine.setItemText(line.name);
      reportLine.setAmount(line.amount);
      reportLine.setAccount(???);
      // how do I set the 'Account' property using the id only, without looking up each account?

      reportLines.add(reportLine);
    }

    return ReportLines;
  }

  public Stream<ImportLineDto> flatMapRecursive(ImportLineDto item) {
    if (item.lines == null) {
      return Stream.empty();
    }

    return Stream.concat(Stream.of(item), item.lines.stream()
        .flatMap(this::flatMapRecursive));
  }

跟进:
如果dto accountid不是表中的实际“id”字段,而是另一个自定义字段,我遇到了另一种类似的情况,这可能吗?我仍然需要第一个问题的答案,但是要有一个标准的id。

nlejzf6q

nlejzf6q1#

您可以使用entitymanager.getreference,如下所述

reportLine.setAccount(entityManager.getReference(Account.class, line.accountId));

相关问题