Spring, Hibernate - relationship / jpa

Odpowiedz Nowy wątek
2018-08-10 18:55
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

Jeśli projekt jest typu JPA, nawet nie myśl o ręcznym generowaniu Id. To ma się odbywać obiektowo. Zależnie od metody jak JPA generuje klucz, dziury w numeracji są ok, nie myśl o tym (jeśli o to pytasz) - AnyKtokolwiek 2018-08-10 19:22
Raczej pokaz kod 'update', jeśli w tym jest problem - AnyKtokolwiek 2018-08-10 19:23
Oki rozumiem, że dziury to całkowicie normalna rzecz, i po prostu nie zwracać na to uwagi? - asam99 2018-08-11 23:18

Pozostało 580 znaków

2018-08-10 21:09
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ć.

edytowany 1x, ostatnio: Aisekai, 2018-08-10 21:10
A nie jest przypadkiem tak, że jeżeli robimy update "całego" obiektu to używamy PUT, a jeżeli tylko np poszczególne pole to PATCH? - tomek1221 2018-08-11 21:11
Chyba tak :) Dzięki, będę wiedział na przyszłość. - Aisekai 2018-08-11 21:26

Pozostało 580 znaków

2018-08-10 22:12
2

Czytaj blog Vlada. Ma praktyczne rozwiązania i porady na wiekszośc typowych problemów:
https://vladmihalcea.com/the-[...]nship-with-jpa-and-hibernate/


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.

Pozostało 580 znaków

2018-08-11 23:13
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)

edytowany 1x, ostatnio: asam99, 2018-08-12 00:14

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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

Robot: CCBot