W niemal każdym programie mamy bazę danych, a w niej tabele. Tabele mają pola określonego typu, a do tego wiążą się w relacje między sobą. Relacje występują w postaci jeden do jednego, jeden do wiele i wiele do wielu.
Na bazie danych wykonujemy zapytania typu
DDL (Data Definition Language), które odpowiadają za tworzenie i modyfikowanie struktur przechowujących dane, na przykład
CREATE,
DROP,
ALTER itp.
W przypadku gdy mamy już stworzone tabele, potrzebujemy jeszcze rozwiązania do pracy z danymi. W tym celu używamy zapytań typu
DML (Data Manipulation Language).
Zapytaniami pochodzącymi z tej grupy są:
SELECT,
INSERT,
UPDATE i DELETE. Dzięki nim możemy wprowadzać dane do bazy, modyfikować je oraz pobierać i usuwać.
Tak to w skrócie wygląda jeśli pracujemy bezpośrednio na bazie i operujemy na niej zapytaniami
SQL. Z drugiej strony, w programie Java używamy obiektów
i to na nich wykonujemy algorytmy i to one przechowują oraz transportują nasze dane. Wypadałoby jakoś te dwa światy połączyć. I tu z pomocą przychodzi warstwa
ORM,
czyli warstwa mapowania obiektowo-relacyjnego. Może ona być obsługiwana przez różne frameworki, ale my oczywiście zajmiemy się sprawdzonym i niezwykle popularnym rozwiązaniem, jakim jest Hibernate.
Baza danych a Hibernate
Korzystając z frameworka w dużej mierze używamy adnotacji. Adnotacje są powszechnym elementem występującym w Springu, ale jeśli zaczynasz dopiero z nim swoją przygodę
- i nieco przewrotnie postanowiłeś zacząć od Hibernate'a - to przypominamy:
Appa Notka.
Adnotacja to fragment tekstu zaczynający się od znaku @, na przykład: @Component,
@Service. Definicja mówi, że
reprezentuje ona metadane, czyli dodatkowe informacje o kodzie źródłowym. Dzięki temu kod taki może być nieco krótszy, bardziej czytelny, a przez to wygodniejszy w użyciu.
Niektóre adnotacje są dostępne już w trakcie kompilacji (compile-time), a inne dopiero podczas działania programu (runtime).
Stosując adnotacje możemy opisać kod tak, by zdefiniować jakich zachowań od niego oczekujemy lub też jakie cechy powinien przyjąć.
Na przykład oznaczając klasę adnotacją @Component wymuszamy na Springu stworzenie obiektu i umieszczenie go w kontenerze,
przez co mamy do niego dostęp w niemalże każdym miejscu programu.
Adnotacje mogą zawierać elementy - nazwane lub nie oraz wartości dla tych elementów, na przykład: @Table(name = "items").
Jeśli adnotacja posiada tylko jeden element value lub posiada value oraz inne elementy, ale mają one określoną wartość domyślną, wtedy nazwa elementu - value może być pominięta, na przykład @SuppressWarnings("unchecked").
Natomiast jeśli adnotacja nie ma w ogóle elementów lub wszystkie z nich mają wartości domyślne wtedy nawet nawiasy mogą być usunięte, na przykład: @Override, @SpringBootApplication.
Jak to się ma teraz do Hibernate'a? Jakich adnotacji możesz się spodziewać i co dzięki nim osiągniesz?
Podstawową adnotacją w Hibernate jest adnotacja
@Entity, która mówi nam, że obiekt danej klasy reprezentuje rekord w tabeli w bazie danych.
Najczęściej stosujemy ją w parze z adnotacją
@Table, w której podajemy nazwę tabeli obsługiwanej przez tę encję.
Nie możemy też zapomnieć o zdefiniowaniu klucza głównego dla naszej tabeli, więc wprowadzamy adnotację
@Id:
To co jeszcze widzisz na powyższym przykładzie, to określenie sposobu generacji identyfikatorów -
@GeneratedValue
oraz definicja kolumny odpowiadającej polu -
@Column. Skoro ma to być identyfikator, to powinien być zawsze ustawiony i musi być unikalny,
stąd też powyższe ustawienia
unique i
nullable. Skąd one się biorą w tym nawiasie?
Otóż, tak jak wspomnieliśmy nieco wyżej, adnotacje dają możliwość określania dodatkowych elementów i tak na przykład wspomniana adnotacja
@Column
pozwala na ustawienie wartości elemntów
unique,
nullable,
name,
length i jeszcze kilku innych. Będziemy do tego tematu wracać omawiając kolejne encje z projektu
przygotowanego na rzecz tego kursu.