Java JPA zamiast OneToOne tworzy się OneToMany.

0

Witam, ja nie dostrzegam, gdzie zrobiłem błąd, zamiast OneToOne tworzy się OneToMany.
Klucz to login i ma być współdzielony, poniżej kod:

@Entity
@Table(name = "user")
public class User {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(unique=true)
    @Id
    private String login;
    private String password;
    private String firstName;
    private String lastName;
    private String city;
    private int age;
    private Sex sex ;
    @OneToOne(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL)
    private UserProfile userProfile;
 
 
@Entity
@Table(name = "user_profile")
public class UserProfile {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;
    @Id
    private String login;
    private String user_interestings;
 
    @OneToOne
    @MapsId
    private User user;

Za pomoc z góry dzięki

0

brakuje @JoinColumn("user_id") na User w UserProfile

0

A nie lepiej w ogóle tego mapowania nie robić? W encji User nie będziesz mieć żadnego pola odnośnie profilu, a w encji UserProfile będziesz mieć zwykłego longa jako userId - potem po prostu byś użył repository a konkretnie metodę findByUserId(..). Bo rozumiem że schemat bazy robisz oddzielnie, skryptami (a nie dajesz np Hibernetowi generować schemat), tak? Jeśli tak (a powinno tak być), to ten sposób co zaproponowałem Ci rekomenduję

0

A jakiś konkretnie błąd? Bo coś mi tutaj nie pasuje. Co to znaczy "tworzy ci się" OneToMany zamiast OneToOne?

0

W załączniku schemat wygenerowanej bazy

0

zrob na odwrot, ze w Userze bedziesz mial id profile, czyli usun mappedBy

1
hugarili napisał(a):

W załączniku schemat wygenerowanej bazy

Po kolei:

  1. Schemat wygenerowanej bazy jest inny od tego, co wklepałeś - w user_profile jest kolumna user_login, której nie ma w klasie. Spróbuj usunąć tabelę i puścić jeszcze raz.
  2. Kiedy już wygenerujesz nową bazę to sprawdź definicję kolumny user_profile.login. Jeśli nie jest unikatowa to dodaj @Column(unique=true)
  3. @nowyworek sugerował dodanie mapowania po user_id - jeśli mapujesz po loginie to usuń to.

Ogólnie to trochę krzywo ta baza wygląda, domyślam się że to jakieś zadanie na studia więc nie komentuję tego rozwiązania. Natomiast jeśli nie potrzebujesz kolumn id w tabelach user_login i user to je po prostu usuń.

0
hugarili napisał(a):

mapowania po user_id - chodzi o mapowanie po LongId nadawanej liczby ? Jeśli tak, to jaki jest tego sens

W rzeczywistym świecie jak najbardziej mapuje się po Long id.
W twoim przypadku jednak kluczem jest kolumna login, czyli nie ma sensu mapować po polu id. Ba, nawet nie powinno się mapować po id.

Ogólnie to według mnie powinno wyglądać to tak:

CREATE TABLE users (
   user_id BIGINT PRIMARY KEY,
   login VARCHAR2(255),
   ...
);

CREATE TABLE user_profiles {
    user_profile_id BIGINT PRIMARY KEY,
    user_id BIGINT UNIQUE,
    ...
    CONSTRAINT fk_user
    FOREIGN KEY (user_id) REFERENCES users(user_id)
};

Dzięki temu unikasz duplikacji kolumny login.

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