Nie ogarniam cascadowania

Odpowiedz Nowy wątek
2018-12-11 19:40
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?

edytowany 16x, ostatnio: Julian_, 2018-12-11 22:16
Pokaż pozostałe 6 komentarzy
wrzuć nam DDL tych tabel, bo coś czuje że masz po prostu gdzieś klucz unique i próbujesz przypisać dwa razy wartość unikalna= baza danych się rzuca - albundy 2018-12-11 22:07
no i też powinieneś zrobić tak, że do drivera przypisujesz np setterem usera, a do usera przypisujesz setterem drivera. Dopiero potem merge - albundy 2018-12-11 22:09
dodałem DDL. Do User nie przypisuje, bo to jednostronna asocjacja. User nie widzi Driver. - Julian_ 2018-12-11 22:16
dobra to takie pytanko. Użytkownik podaje user w jaki sposób? Wysyłasz DTO od klienta i konwertujesz czy pobierasz z bazy danych przed zapisanem? Wychodzi na to, że z jakiegoś powodu jest persist i próbuje ci zapisać tą encję jako nową, a powinien być merge - albundy 2018-12-11 22:21
Czemu na temat piszecie w komentarzach a nie postach? - Pinek 2018-12-12 00:31

Pozostało 580 znaków

2018-12-12 17:29
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

edytowany 12x, ostatnio: Julian_, 2018-12-12 21:02
SpringData się nie buntował ? Dziwne. - jarekr000000 2018-12-12 18:51
chyba ładował do jakiejś systemowej tabeli USER, bo teraz się wszystko powypieprzało - Julian_ 2018-12-12 19:48

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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