Надеюсь, вы все здоровы!
У меня есть ситуация, в которой у меня есть бэкэнд-приложение, которое предоставляет остальные API для создания данных, связанных с отчетами о расходах. Основным объектом, который позволяет создавать этот API, является «Отчет о расходах», с которым связаны другие объекты, такие как страна, в которой были произведены расходы, и пользователь, который его создал.
Дело в том, мой контроллер получает DTO, преобразует его в объект JPA и затем отправляет его в класс обслуживания. В моем классе обслуживания я должен проверить, связано ли поле связанной сущности, например, имя пользователя для пользователя или код страны для страны, а затем go в соответствующее хранилище сущностей и получить соответствующую сущность.
public ExpenseReport save(ExpenseReport expenseReport) {
if (expenseReport.getId() != null) {
expenseReportRepository.findById(expenseReport.getId())
.ifPresent(currentObject -> {
expenseReport.setId(currentObject.getId());
expenseReport.setVersion(currentObject.getVersion());
});
}
if (expenseReport.getUser() != null && expenseReport.getUser().getUsername() != null) {
String username = expenseReport.getUser().getUsername();
userRepository.findByUsername(username)
.ifPresentOrElse(user -> {
expenseReport.setUser(user);
},
() -> {
throw new InvalidDataException(User.class, "username", username);
});
}
if (expenseReport.getCountry() != null && expenseReport.getCountry().getCode() != null) {
String countryCode = expenseReport.getCountry().getCode();
countryRepository.findByCode(countryCode)
.ifPresentOrElse(country -> {
expenseReport.setCountry(country);
},
() -> {
throw new InvalidDataException(Country.class, "countryCode", countryCode);
});
}
for (ExpenseItem expenseItem : expenseReport.getExpenses()) {
if (expenseItem.getCurrency() != null && expenseItem.getCurrency().getCode() != null) {
String currencyCode = expenseItem.getCurrency().getCode();
currencyRepository.findByCode(currencyCode)
.ifPresentOrElse(currency -> {
expenseItem.setCurrency(currency);
},
() -> {
throw new InvalidDataException(Currency.class, "currencyCode", currencyCode);
});
}
if (expenseItem.getExpenseCity() != null && expenseItem.getExpenseCity().getCode() != null) {
String expenseCityCode = expenseItem.getExpenseCity().getCode();
cityRepository.findByCode(expenseCityCode)
.ifPresentOrElse(city -> {
expenseItem.setExpenseCity(city);
},
() -> {
throw new InvalidDataException(City.class, "expenseCityCode", expenseCityCode);
});
}
if (expenseItem.getCategory() != null && expenseItem.getCategory().getCode() != null) {
String categoryCode = expenseItem.getCategory().getCode();
categoryRepository.findByCode(categoryCode)
.ifPresentOrElse(expenseCategory -> {
expenseItem.setCategory(expenseCategory);
},
() -> {
throw new InvalidDataException(ExpenseCategory.class, "expenseCategoryCode", categoryCode);
});
}
}
return expenseReportRepository.save(expenseReport);
}
Мой вопрос: это лучший способ сделать это? Я чувствую, что если объект становится слишком сложным, мне придется создать этот супер гигантский метод сохранения.
Предлагает ли JPA лучшее решение для этого? Я подумывал также изменить параметризованные типы (например, страну, город, штат), чтобы использовать сам код в качестве первичного ключа, а не автоматически сгенерированный идентификатор.
С уважением.