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, aDriver
zapisany bez przydzielonegoUser
- 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
iDriver
- 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ć doDriver
bez ponownego zapisywaniaUser
. 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?