Spring, Hibernate - relationship / jpa

0

Hej, mam kilka pytań odnośnie relacji bawię się z tym od kilku dni, i albo coś źle interpretuje, albo nie potrafię czegoś zrozumieć dziwne smyczki mi wychodzą przy zapisach w MySQL, nie potrafię, że tak powiem przejść dalej, i mnie to strasznie blokuje być może jak na początek zbyt wysoko postawiłem sobie poprzeczkę proszę o wskazówkę

Dotychczas mam zrobiony panel logowania/rejestracji przy użyciu spring security, mogę stworzyć Usera, ale problem jest wtedy gdy chcę zaktualizować metodą POST jego informacje o adresie załóżmy, że tworzę 3 użytkowników mają oni (PK) 1,2,3 teraz chcę zrobić update adresu, przy stworzeniu update adres ma PK zaczyna się od 4, a FK jest nullem

Klasa user, i adress

@Entity
@Table(name = "USER")
public class User {

    @Id
    @GeneratedValue
    @Column(name = "USER_ID")
    private Long id;

    private String username;
    private String password;

    public User() {}
}

// getters setters
@Entity
@Table(name = "ADDRESS")
public class Address {

    @Id
    @GeneratedValue
    @Column(name = "ADDRESS_ID", nullable = false)
    private long id;

    private String street;
    private String city;


    @OneToOne
    @JoinColumn(name = "USER_ID")
    private User user;

    public Address(){}
// geterry i settery

Zastanawiam się, czy dobrze wykonałem taką relacje OneToOne, czy może powinienem to inaczej zrobić coś w stylu dołożyć klasę UserAddress i tam połączyć obie strony tej relacji, i przy stworzeniu usera od razu wygenerować jego PK do Adresu, i od razu zaktualizować ją w UserAdress, a później po zalogowaniu użytkownika pobrać id użytkownika i ją za aktualizować?

Jak do tej pory stworzeniu czegoś prostego jak rejestracja czy stworzenie jakiegoś todo nie sprawiło mi zbyt dużych problemów, ale na tym kompletnie się wyłożyłem, nie potrafię tego przypisać,a nawet jak już coś uda mi się przypisać to powstają mi mankamenty w bazię, że nawet jak dobrze przypisuję mi FK w bazie, to nagle kolejny PK jest większy o 2/3 ID od poprzedniego, kompletnie nie wiem gdzie leży problem, proszę o nakierowanie gdzie robię błąd

0

problem jest wtedy gdy chcę zaktualizować metodą POST

"Metoda" post nie służy do aktualizowania obiektów, tylko do tworzenia nowych. Metodą do zmiany istniejących obiektów, jest "put".
I tak bez reszty kodu ciężko cokolwiek powiedzieć.

2

Czytaj blog Vlada. Ma praktyczne rozwiązania i porady na wiekszośc typowych problemów:
https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/

0

Dzięki za naprowadzenie zlokalizowałem problem dzięki wam, już myślałem, że to może wina relacji a po prostu mój FK był nullem.

Aisekai napisał(a):

problem jest wtedy gdy chcę zaktualizować metodą POST

"Metoda" post nie służy do aktualizowania obiektów, tylko do tworzenia nowych. Metodą do zmiany istniejących obiektów, jest "put".
I tak bez reszty kodu ciężko cokolwiek powiedzieć.

Ustawiłem początkowo metodę POST żeby znaleźć źródło problemu, ale niestety nie mogłem

Dzięki za linka do bloga Vlada, na pewno rzucę okiem ;) początkowo też myślałem czy nie powinienem tutaj zrobić sharedPK no tak jak mówię nie jestem jakiś wyjadaczem ale uczę się :)

Problem był po stronie update, wartość FK była nullem, początkowo myślałem, że FK zaktualizuje się z automatu jak jest stworzona relacja, jednak nie. Pobrałem name od użytkownika przez Security

Authentication auth = SecurityContextHolder.getContextHolderStrategy().getContext().getAuthentication();
auth.getName();

Teraz zastanawiałem się co mogę, potrzebowałem ID, a nie username, zrobiłem Query w repozytorium

 @Query("SELECT u.id FROM User u WHERE u.username = :username")
 Long find(@Param("username") String username);

po wyciągnięciu przypisanie, i działa tak jak zamierzałem, zastanawiam się tylko czy to dobra praktyka czy nie powinienem zrobić tego w inny sposób?
Te dziury w bazie to jest normalne? (dodałem załącznik)

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