Mysql schemat bazy oraz odpowiadajce mu encje

Odpowiedz Nowy wątek
2014-12-10 10:58
0

Tworzę baze danych plus encje w play framework. w tym frameworku tworzy sie tabele w skrypcie dla mysql a pozniej nalezy do tego napisac odpowiednie klasy encji w kodzie Javy...
I tutaj natrafilem na porblemy. Mianowicie - napisalem sobie dwie tabele:

CREATE TABLE Users (
    user_id bigint(20) NOT NULL AUTO_INCREMENT,
    user_settings_id bigint(20) NOT NULL,
    PRIMARY KEY (user_id),
    FOREIGN KEY (user_settings_id)
    REFERENCES User_settings(user_setting_id)
);

CREATE TABLE User_settings (
    user_setting_id bigint(20) NOT NULL AUTO_INCREMENT,
    title varchar(255) NOT NULL,
    PRIMARY KEY (user_setting_id)
);

Do tego napisalem odpowiednie encje:

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

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="USER_ID")
    private long userId;

    @OneToOne(fetch = FetchType.LAZY, targetEntity = UserSettings.class)
    @JoinTable(name = "USER_SETTINGS")
    private UserSettings userSettings = new UserSettings();
}

@Entity
@Table(name="USER_SETTINGS")
public class UserSettings {
    @Id 
    @Column(name="USER_SETTINGS_ID")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long userSettingsId = 0;

        private string avatar = "";

}

Czy ktos mógby mi wytumaczyć na czy polega związek pomiędzy kluczami obcymi a relacjami pomiędzy entities?
Czy jezeli pisze relacje w entity (onetomany manytoone itp) to musze robić foreign key w create table?

I jeszcze jedno mam pytanko:
jeżeli Mam powyższe relacje onetoone i będe chcia utworzyć nowego użytkownika potrzebuję również obiektu UserSettings.
U mnie - podczas tworzenia usera wywala bąd ponieważ nie mam żadnych UserSettings :(
Jak to zrobić żeby UserSetting się tworzyy automatycznie gdy User jest tworzony?
Moje drugie pytanie:
Jezeli mamy tą relację onetoone czy jest mozliwość żeby nie tworzyć UserSetting od razu, tylko wtedy kiedy jest potrzebne (pórbowaem fetch = FetchType.LAZY ale nie dziaa.)

za wszelką pomoc jestem baaardzo wdzięczy :)

Pozostało 580 znaków

2014-12-10 12:41

Klucze obce w bazie odwzorowują relacje pomiędzy encjami. W tym konkretnym przypadku w USERS masz klucz obcy wskazujący na USER_SETTINGS ponieważ w klasie User nie zdefiniowałeś innych ustawień (np. z dodatkową tabelą łączącą) i zastosowano domyślny sposób.

Jeśli chodzi o ten nowy obiekt UserSettings to zobacz, że klucz w USER jest NOT NULL, czyli jeżeli go nie tworzysz to baza wyrzuca błąd związany z naruszeniem ograniczeń dla kolumny.

FetchType służy do opisu tego w jaki sposób mają być pobierane dane, a nie do opisu związku pomiędzy nimi.

edytowany 1x, ostatnio: Koziołek, 2014-12-10 12:42

Pozostało 580 znaków

2014-12-10 13:26
0

THX za odpowiedź :)

A czy mogę z bazy powyrzucać wszystkie obce klucze i relacje powiazać na poziomie Entities (onetomany itp)? nie będzie to jakiś antypatern? aLbo czy nie spowoduje to jakiś bledów?

edytowany 1x, ostatnio: remigio, 2014-12-10 13:37

Pozostało 580 znaków

2014-12-10 13:46
1

Nie rób tego, bo w tym momencie nie potrzebujesz ORMa. Ja bym zrobil inaczej. Zamodelował sobie wszystko na poziomie klas i pozwolił hibernate-owi wygenerować strukturę bazy. Natępnie zrobił bym review tego co wygenerował i wprowadził jakieś lokalne poprawki.

Pozostało 580 znaków

2014-12-10 15:58
0

Thx za odpowiedz... w zwiazku z tym ze musze miec te skrypty w play'u to uzylem hibernate create property w persistent (co wydrukowalo mi tabele w bazie) a nastepnie wygenerowalem skrypty z istniejacych tabelll...

Dzieki za pomoc :)

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