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