Driver
zawiera User
, jednokierunkowa asocjacja @OneToOne
:
public class Driver{
// ...
@OneToOne(cascade= {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
private User user;
// ...
}
public class DriverDto {
// ...
@JsonUnwrapped
private UserDto userDto;
// ...
}
public class User {
@Id
private String login;
// ...
DDL:
create table driver (id bigint generated by default as identity, first_name varchar(255), is_active boolean not null, last_name varchar(255), pesel_encrypted varchar(255), user_login varchar(255), primary key (id))
create table user (login varchar(255) not null, email varchar(255), is_active boolean not null, user_role varchar(255), primary key (login))
alter table driver add constraint FK5rw3bhcdybvt52oh97qodjuqx foreign key (user_login) references user
Oczekiwane przypadki użycia przy zapisywaniu nowego Driver
:
- użytkownik nie podaje
User
:
{
"id": 1,
"pesel": "94112757255",
"firstName": "Janusz",
"lastName": "Nosacz"
}
Wtedy User
nie powinien być zapisywany, a Driver
zapisany bez przydzielonego User
- OK, działa.
- użytkownik podaje nowego
User
, jeszcze nie zapisanego:
{
"id": 1,
"pesel": "94112757255",
"firstName": "Janusz",
"lastName": "Nosacz",
"login": "newuser",
"email": "[email protected]"
}
wtedy jpa powinien automatycznie zapisać User
i Driver
- OK działa przy cascadowaniu, ale bez cascadowania trzeba wywoływać zapisywanie ręczne
- Użytkownik podaje
User
, który już istnieje w bazie:
{
"id": 1,
"pesel": "94112757255",
"firstName": "Janusz",
"lastName": "Nosacz",
"login": "alreadyexists",
"email": "[email protected]"
}
wtedy jpa powinien User
przypisać do Driver
bez ponownego zapisywania User
. Tutaj przy cascadowaniu pojawia się błąd, że "naruszam klucz główny lub indeks unikalny". Bez cascadowania działa OK.
Jak to powienienem zrobić by działało tak jak chcę, wykorzystując atuty jpa?