Hibernate - каскадные объекты с отношениями oneToMany - PullRequest
1 голос
/ 14 июня 2019

Я не уверен, правильно ли реализую метод, отвечающий за вставку 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.

Другими словами, если бы я сделал каскадную вставку, то мог бы быть дублированный ключошибка, поэтому я должен был проверить «вручную», если есть страны, торги, продукты в базе данных уже, как в вышеупомянутом методе.Вопрос в том, могу ли я сделать это по-другому, более "автоматически"?

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