Я не уверен, правильно ли реализую метод, отвечающий за вставку Product из пользовательского ввода.Основные классы:
Product.java
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
private BigDecimal price;
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
@ManyToOne
@JoinColumn(name = "producer_id")
private Producer producer;
Producer.java
public class Producer {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "country_id")
private Country country;
@ManyToOne
@JoinColumn(name = "trade_id")
private Trade trade;
}
Метод добавленияпродукт в БД:
try {
var product = ProductUtil.createProductFromUserInput();
var category = OptionalHelper.of(categoryService
.getCategoryByName(product.getCategory().getName()))
.ifNotPresent(() ->
categoryService.addCategoryToDb(product.getCategory()).orElseThrow(() -> new AppException("Category is null")));
var country = OptionalHelper.of(countryService
.getCountryByName(product.getProducer().getCountry().getName()))
.ifNotPresent(() ->
countryService.addCountryToDb(product.getProducer().getCountry()).orElseThrow(() -> new AppException("Country is null")));
product.getProducer().setCountry(country);
var trade = OptionalHelper.of(tradeService
.getTradeByName(product.getProducer().getTrade().getName()))
.ifNotPresent(() ->
tradeService.addTradeToDb(product.getProducer().getTrade()).orElseThrow(() -> new AppException("Trade is null")));
product.getProducer().setTrade(trade);
var producer = OptionalHelper.of(producerService
.getProducerByNameAndTradeAndCountry(
product.getProducer().getName(), product.getProducer().getTrade(), product.getProducer().getCountry()))
.ifNotPresent(() ->
producerService.addProducerToDb(product.getProducer()).orElseThrow(() -> new AppException("Producer is null")));
product.setCategory(category);
product.setProducer(producer);
productService.addProductToDbFromUserInput(product);
} catch (Exception e) {
log.info(e.getMessage());
log.error(Arrays.toString(e.getStackTrace()));
throw new AppException(String.format("%s;%s: %s", PRODUCT, ERROR_WHILE_INSERTING, e.getMessage()));
}
Дело в том, что я не могу делать каскадирование при сохранении производителей, продуктов и сделок, потому что существуют требования к уникальности продуктов по названию, стране и торговле, торговля должна бытьуникальный по имени, продукт должен быть уникальным по имени, категории и стране, страна должна быть уникальной по имени. \ etc.
Другими словами, если бы я сделал каскадную вставку, то мог бы быть дублированный ключошибка, поэтому я должен был проверить «вручную», если есть страны, торги, продукты в базе данных уже, как в вышеупомянутом методе.Вопрос в том, могу ли я сделать это по-другому, более "автоматически"?