Nie ogarniam cascadowania

0

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:

  1. 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.

  2. 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

  3. 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?

0

znalazłem błąd, który może być przyczyną:

@Repository
public interface UserRepo extends JpaRepository<User, Long>{

//...

podczas, gdy:

public class User {

    @Id
    private String login;

// ...

EDIT:
jednal główny problem wciąż nie został rozwiązany:

ładuję Driver z loginem Usera, który już jest w bazie, więc chce by go nie próbował zapisać ponownie, a on próbuje zapisać, więc wywala naruszenie klucza głównego, bo User o loginie "user" już istnieje:

{
        "id": 100
        "pesel": "94112757255",
        "firstName": "Janusz",
        "lastName": "Nosacz",
        "login": "user"
}

zaktualizowałem githuba:
https://github.com/trolololol[...]rc/main/java/com/julian/bella

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0