Я пытаюсь составить карту между сущностью и DTO. Однако у меня есть проблема. У субъекта есть два иностранных ключа, и это делает картирование труднее. Проблема заключается в функции toentity () .
В приведенной ниже строке мне нужно отправить два объекта, а именно Testcaseversion и Apprelease для создания поломки объекта.
Breakage breakage = BreakageMapper.toEntity(breakageDTO, entity, getAppReleaseEntity(breakageDTO));
Однако даже в testcaseversionmapper.toentity TestCaseversion предоставляется Apprelease нет. Это также относится к другим функциям TOSTITY других классов Mapper.
Я попытался решить эту проблему, получив объект Apprelease с помощью репозитория, но тогда мне нужно было сделать функцию Toentity не статичной. Но на этот раз он не принимал метод нестатического toentity () в BreakageMapper . Тем не менее, BreakeAgeMapper.toEntity () также должен быть нестативным, потому что у него такая же проблема, сохраняя объект с двумя иностранными ключами.
Есть ли способ решить эту проблему? Или лучшая структура для DTOS или метода Post. Прямо сейчас я принимаю DTOS в своих методах публикации. @PostMapping
public ResponseEntity save(@RequestBody TestCaseVersionDTO testCaseVersion) {
TestCaseVersionDTO testCaseVersionDTO = testCaseVersionService.save(testCaseVersion);
return ResponseEntity.status(HttpStatus.CREATED).body(testCaseVersionDTO);
}
< /code>
Service: < /p>
public TestCaseVersionDTO save(TestCaseVersionDTO testCaseVersionDTO) {
TestCaseVersion testCaseVersion = TestCaseVersionMapper.toEntity(testCaseVersionDTO);
testCaseVersionRepository.save(testCaseVersion);
testCaseVersionDTO.setId(testCaseVersion.getId());
return testCaseVersionDTO;
}
< /code>
testcaseversionmapper: < /p>
public class TestCaseVersionMapper {
private final AppReleaseRepository appReleaseRepository;
public TestCaseVersionMapper(AppReleaseRepository appReleaseRepository) {
this.appReleaseRepository = appReleaseRepository;
}
public TestCaseVersion toEntity(TestCaseVersionDTO dto, TestCase parentTestCase) {
if (dto == null) return null;
TestCaseVersion entity = new TestCaseVersion();
entity.setTestCase(parentTestCase);
entity.setTestCaseVersionName(dto.getTestCaseVersionName());
if (dto.getBreakages() != null) {
List
breakages = dto.getBreakages().stream()
.map(breakageDTO -> {
Breakage breakage = BreakageMapper.toEntity(breakageDTO, entity, getAppReleaseEntity(breakageDTO));// THE PROBLEM IS HERE
breakage.setTestCaseVersion(entity);
return breakage;
})
.collect(Collectors.toList());
entity.setBreakages(breakages);
}
if (dto.getLineOfCodes() != null) {
List lineOfCodes = dto.getLineOfCodes().stream()
.map(lineOfCodeDTO -> {
LineOfCode lineOfCode = LineOfCodeMapper.toEntity(lineOfCodeDTO, entity);
lineOfCode.setTestCaseVersion(entity);
return lineOfCode;
})
.collect(Collectors.toList());
entity.setLineOfCodes(lineOfCodes);
}
return entity;
}
public AppRelease getAppReleaseEntity(BreakageDTO breakageDTO){//MY WEAK ATTEMPT TO SOLVE THE PROBLEM
return appReleaseRepository.getReferenceById(breakageDTO.getAppRelease());
}
}
< /code>
breakagemapper: < /p>
public class BreakageMapper {
private final LineOfCodeRepository lineOfCodeRepository;
public BreakageMapper(LineOfCodeRepository lineOfCodeRepository) {
this.lineOfCodeRepository = lineOfCodeRepository;
}
public Breakage toEntity(BreakageDTO dto, TestCaseVersion parentTestCaseVersion, AppRelease parentAppRelease) {
if (dto == null) return null;
Breakage entity = new Breakage();
entity.setAppRelease(parentAppRelease);
entity.setTestCaseVersion(parentTestCaseVersion);
entity.setTaxonomyDescription(dto.getTaxonomyDescription());
if (dto.getRepairALineOfCodes() != null) {
List repairALineOfCodes = dto.getRepairALineOfCodes().stream()
.map(repairALineOfCodeDTO -> {
RepairALineOfCode repairALineOfCode = RepairALineOfCodeMapper.toEntity(repairALineOfCodeDTO, entity, getLineOfCodeEntity(repairALineOfCodeDTO));//SAME PROBLEM
repairALineOfCode.setBreakage(entity);
return repairALineOfCodeDTO;
})
.collect(Collectors.toList());
entity.setRepairALineOfCodes(repairALineOfCodes);
}
return entity;
}
public LineOfCode getLineOfCodeEntity(RepairALineOfCodeDTO repairALineOfCodeDTO){
return lineOfCodeRepository.getReferenceById(repairALineOfCodeDTO.getLineOfCodeID());
}
}
< /code>
dtos < /p>
public class TestCaseVersionDTO {
private int id;
private String testCaseVersionName;
private int testCaseId;
private List lineOfCodes = new ArrayList();
private List
breakages = new ArrayList();
public TestCaseVersionDTO() {}
public TestCaseVersionDTO(int id, String testCaseVersionName, int testCaseId, List lineOfCodes, List
breakages) {
this.id = id;
this.testCaseVersionName = testCaseVersionName;
this.testCaseId = testCaseId;
this.lineOfCodes = lineOfCodes;
this.breakages = breakages;
}
< /code>
public class BreakageDTO {
private int id;
private int appReleaseID;
private int testCaseVersionID;
private List repairALineOfCodes = new ArrayList();
public BreakageDTO() {}
public BreakageDTO(int id, int appReleaseID, int testCaseVersionID, List repairALineOfCodes) {
this.id = id;
this.appReleaseID = appReleaseID;
this.testCaseVersionID = testCaseVersionID;
this.repairALineOfCodes = repairALineOfCodes;
}
< /code>
Модели < /p>
@Entity
@Table(name = "T_TEST_CASE_VERSION")
public class TestCaseVersion {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull
@Column(name = "ID")
private int id;
@NotNull
@Column(name = "NAME")
private String testCaseVersionName;
@OneToMany(mappedBy = "testCaseVersion", cascade = CascadeType.ALL, orphanRemoval = true)
private List lineOfCodes = new ArrayList();
@OneToMany(mappedBy = "testCaseVersion", cascade = CascadeType.ALL, orphanRemoval = true)
private List
breakages = new ArrayList();
@ManyToOne
@NotNull
@JoinColumn(name = "test_case_id", nullable = false)
private TestCase testCase;
< /code>
@Entity
@Table(name = "T_BREAKAGE")
public class Breakage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull
@Column(name = "ID")
private int id;
@ManyToOne
@JoinColumn(name = "app_release_id", nullable = false)
@NotNull
private AppRelease appRelease;
@ManyToOne
@JoinColumn(name = "test_case_version_id", nullable = false)
@NotNull
private TestCaseVersion testCaseVersion;
@OneToMany(mappedBy = "breakage", cascade = CascadeType.ALL, orphanRemoval = true)
private List repairALineOfCodes = new ArrayList();
Подробнее здесь: https://stackoverflow.com/questions/795 ... reign-keys