Вы не понимаете, как работает двунаправленное отображение, поэтому вам нужно продумать это.Код
@OneToOne(fetch = FetchType.LAZY)
@MapsId
private Customer customer;
в Address
делает отображение однонаправленным.Обычно, чтобы сохранить это, вам нужно установить поле customer
и сохранить его.
address.setCustomer(customer);
addressRepo.save(address);
Однако вы определили двунаправленное отображение и предоставили каскадную аннотацию.
@OneToOne(mappedBy = "customer", cascade = CascadeType.ALL)
private Address address;
Каскадная аннотация освобождает вас от необходимости выполнять две персистентные операции (в вашем коде), но это не означает, что вам не нужно устанавливать поле клиента в адресе.Кроме того, как вы заметили, для того, чтобы каскадная операция работала, вам нужно установить адресное поле заказчика.
customer.setAddress(address);
Итак, чтобы код работал правильно, вам нужно изменить его, чтобы установитьклиент по адресу.
Address address = new Address();
Customer customer = new Customer();
customer.setAddress(address);
address.setCustomer(customer);
customerRepo.save(customer);
При двунаправленном отображении вы должны управлять обеими сторонами отношений или использовать его однонаправленным образом для сохранения и двунаправленным способом для извлечения.Если вы добавите каскадную аннотацию, то вам придется также управлять обеими сторонами отношений для сохранения.