Лучший способ создать сервис, который вставляет сложную сущность - PullRequest
0 голосов
/ 19 марта 2020

Надеюсь, вы все здоровы!

У меня есть ситуация, в которой у меня есть бэкэнд-приложение, которое предоставляет остальные 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 лучшее решение для этого? Я подумывал также изменить параметризованные типы (например, страну, город, штат), чтобы использовать сам код в качестве первичного ключа, а не автоматически сгенерированный идентификатор.

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...