Как вставить значения в PostConstruct

У меня есть база данных H2 в памяти с 4 таблицами.

Таблица Shop имеет связь с таблицей Address.

Теперь я хочу вставить некоторые значения в мой метод PostConstruct.

Итак, мои определения таблиц выглядят так:

Магазин:

@NotBlank
@Size(min = 2, max = 50)
@Column(name  = "name")
private String name;

@NotNull
@ManyToOne
@JoinColumn(name  = "address")
private Address address;

@ElementCollection
@JoinTable(name = "shop_products")
private List<Product> products;

Адрес

@NotBlank
@Size(min = 2, max = 50)
@Column(name  = "address", unique = true)
private String address;

Товар

@NotBlank
@Size(min = 2, max = 50)
@Column(name  = "name", unique = true)
private String name;

@NotBlank
@Size(min = 2, max = 50)
@Column(name  = "manufacturer")
private String manufacturer;

@NotNull
@Column(name  = "currentPrice")
private BigDecimal currentPrice;

А это мои классы обслуживания с методом PostConsutrct:

Адрес

@PostConstruct
public void initDb() {
    Address address1 = Address.builder().address(AddressEnum.BURGENLAND.toString()).build();
    Address address2 = Address.builder().address(AddressEnum.WIEN.toString()).build();
    Address address3 = Address.builder().address(AddressEnum.TIROL.toString()).build();
    addressRepository.saveAll(List.of(address1, address2, address3));
}

Товар

@PostConstruct
public void initDb() {
    Product product1 = Product.builder().name(ProductEnum.HAMMER.toString()).currentPrice(new BigDecimal(10)).manufacturer("Makita").build();
    Product product2 = Product.builder().name(ProductEnum.KNIFE.toString()).currentPrice(new BigDecimal(20)).manufacturer("Bosch").build();
    Product product3 = Product.builder().name(ProductEnum.NAIL.toString()).currentPrice(new BigDecimal(30)).manufacturer("Hilti").build();
    productRepository.saveAll(List.of(product1, product2, product3));
}

Магазин

@PostConstruct
public void initDb() {
    Shop shop1 = Shop.builder().name("Shop 1").address(new Address(AddressEnum.BURGENLAND.toString())).build();
    Shop shop2 = Shop.builder().name("Shop 2").address(new Address(AddressEnum.BURGENLAND.toString())).build();
    Shop shop3 = Shop.builder().name("Shop 3").address(new Address(AddressEnum.BURGENLAND.toString())).build();
    shopRepository.saveAll(List.of(shop1, shop2, shop3));
}

Если я удалю PostConstruct в своем классе ShopService, это сработает, но тогда у меня не будет никаких данных в моей таблице Shop.

При запуске моего приложения с PostConstruct я всегда получаю следующее сообщение об ошибке:

TransientPropertyValueException: свойство Not-null ссылается на переходное значение — переходный экземпляр должен быть сохранен перед текущей операцией

Проблема в том, что я не знаю, как избавиться от сообщения об ошибке?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
55
1

Ответы 1

Теперь я изменил следующее:

Я добавил каскад = CascadeType.ALL в свой класс модели магазина.

@NotNull
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name  = "address")
private Address address;

Теперь это работает.

Другие вопросы по теме