У меня есть база данных 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 ссылается на переходное значение — переходный экземпляр должен быть сохранен перед текущей операцией
Проблема в том, что я не знаю, как избавиться от сообщения об ошибке?




Теперь я изменил следующее:
Я добавил каскад = CascadeType.ALL в свой класс модели магазина.
@NotNull
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address")
private Address address;
Теперь это работает.