Java 创建插入复杂实体的服务的最佳方法

Java 创建插入复杂实体的服务的最佳方法,java,spring-boot,jpa,spring-data-jpa,Java,Spring Boot,Jpa,Spring Data Jpa,希望你们都健康 我有一种情况,我有一个后端应用程序,它公开一个RESTAPI来创建与费用报告相关的数据。此API允许创建的主要实体是“费用报告”,其中包含与之相关的其他实体,例如发生费用的国家和创建费用的用户 问题是,我的控制器接收DTO,将其转换为JPA实体,然后将其发送到服务类。在我的服务类中,我必须检查是否存在相关的实体字段,如用户的用户名或国家/地区的国家/地区代码,然后进入相应的实体存储库并获取相应的实体 public ExpenseReport save(ExpenseReport

希望你们都健康

我有一种情况,我有一个后端应用程序,它公开一个RESTAPI来创建与费用报告相关的数据。此API允许创建的主要实体是“费用报告”,其中包含与之相关的其他实体,例如发生费用的国家和创建费用的用户

问题是,我的控制器接收DTO,将其转换为JPA实体,然后将其发送到服务类。在我的服务类中,我必须检查是否存在相关的实体字段,如用户的用户名或国家/地区的国家/地区代码,然后进入相应的实体存储库并获取相应的实体

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是否提供了更好的解决方案?我还考虑更改参数化类型(如国家、城市、州),将代码本身用作主键,而不是自动生成的id


注意。

数据的验证应与数据的保存分开。在使用javax.Validation注释进行反序列化期间,您可以免费获得大量验证。数据的验证应与数据的保存分开。在使用javax.Validation进行反序列化期间,您可以免费获得大量验证注释。