Mysql schemat bazy oraz odpowiadajce mu encje

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 :)

1

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.

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?

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.

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 :)

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