Hibernate Flashcards
Zalety ORM
- Abstrakcja bazy danych: Praca na poziomie obiektów zamiast SQL.
- Niezależność od bazy danych: Ułatwia zmianę systemu baz danych.
- Zwiększona produktywność: Skupienie na logice biznesowej, mniej ręcznego kodu SQL.
- Wsparcie dla skomplikowanych operacji: Dziedziczenie, kompozycja, wielowątkowość.
- Bezpieczeństwo: Ochrona przed atakami typu SQL Injection.
- Optymalizacja wydajności: Pamięć podręczna, leniwe ładowanie, wsparcie dla transakcji.
- Zarządzanie relacjami: Naturalne zarządzanie relacjami obiektów.
- Spójność: Jednolita reprezentacja danych.
Czym jest ORM
ORM, czyli Object-Relational Mapping , to technika programowania, która umożliwia konwersję danych pomiędzy systemami relacyjnymi baz danych a obiektowo zorientowanymi językami programowania.
Czym jest sesja w Hibernate?
- Sesja w Hibernate reprezentuje pojedynczą jednostkę pracy z bazą danych.
- Sesja umożliwia operacje CRUD (tworzenie, odczytzarządzanie transakcjami
- dowolna ilość sesji w aplikacji
- ywanie, aktualizację, usuwanie) na obiektach
- zarządzanie transakcjami
- zapewnia kontekst dla persystencji obiektów.
Czym jest SessionFactory w Hibernate?
- specjalny obiekt, który jest punktem wyjścia do tworzenia aplikacji z hibernate
- odpowiedzialna za tworzenie obiektów Session
- odpowiedzialna za utrzymanie połączenia z bazą danych oraz konfiguracje
- jjedna Session Factory dla każdej bazy danych
- ma cache drugiego poziomu
Najwżniejsze interfejsy w Hibernate
Configuration
SessionFactory
Session
Criteria
Query
Transaction
Czym jest Lazy Loading w kontekście Hibernate?
- Lazy Loading to technika ładowania danych w momencie, gdy są one rzeczywiście potrzebne
- ## obiekty powiązane z głównym obiektem (np. kolekcje) nie są ładowane od razu razem z głównym obiektem, ale dopiero wtedy, gdy próbuje uzyskać do nich dostęp.
Czym jest cache ?
- mechanizmu, który umożliwia przechowywanie obiektów w pamięci między sesjami (transakcjami),
- pozwala na zmniejszenie liczby kosztownych zapytań do bazy danych
Cache piewszego poziomu vs Cache drugiego poziomu
czym jest Hibernate Configuration File
- hibernate.cfg.xml, to podstawowy plik XML używany do konfigurowania Hibernate.
- określenie szczegółów dotyczących połączenia z bazą danych, właściwości dialektu bazy danych oraz innych globalnych ustawień
- umożliwia określenie mapowanych klas lub plików mapowania, które definiują, jak obiekty Java powinny być przechowywane w bazie danych.
Podstawowe elementy hibernate.cfg.xml
- dotyczące sterownika JDBC,
- adresu URL bazy danych,
- nazwy użytkownika, hasła itp.
- wybór dialektu SQL,
- konfiguracja cache 2 poziomu
- format logowania zapytań SQL.
- które klasy są mapowane do tabel w bazie danych.
jak stworzyc klase immutable w hibernate przy pomocy XML?
markingmutable=false
CZYM JEST Hibernate Inheritance Mapping?
- technika mapowania hierarchii dziedziczenia w klasach do struktur table w bazie danych
Jakie są trzy główne strategie mapowania dziedziczenia w Hibernate?
- Table Per Class Hierarchy (Jedna tabela dla całej hierarchii).
- Table Per Concrete Class (Jedna tabela dla każdej konkretnej klasy).
- Table Per Subclass (Jedna tabela dla każdej podklasy).
Opisz strategię “SingleTable Strategy”.
- Wszystkie klasy w hierarchii dziedziczenia są mapowane na** jedną tabelę. **
- Wprowadzenie kolumny dyskryminatora, która określa typ konkretnej instancji.
- Kolumny, które nie są wspólne dla wszystkich podklas, mogą mieć wartość NULL.
Opisz strategię “Table Per Concrete Class”.
- Dla każdej konkretnej klasy w hierarchii dziedziczenia tworzona jest osobna tabela.
- Nie ma potrzeby kolumny dyskryminatora.
- Może to prowadzić do powielenia kolumn w wielu tabelach i konieczności wielokrotnego odwzorowania wspólnych atrybutów w każdej tabeli.
Opisz strategię “Table Per Subclass”.
- Dla każdej klasy w hierarchii dziedziczenia tworzona jest osobna tabela, ale jedynie z atrybutami, które są unikalne dla tej klasy.
- Tablice są połączone za pomocą klucza głównego.
- Eliminuje problem wartości NULL oraz problem dublowania kolumn.
@Entity
Oznacza klasę jako encję, co sprawia, że jest mapowana do tabeli w bazie danych.
Klasy oznaczone tą adnotacją mogą być używane w operacjach CRUD za pomocą sesji Hibernate.
@Table
Umożliwia określenie nazwy tabeli i innych opcji tabeli dla mapowanej encji. Jeśli nie jest używana, nazwa klasy zostanie użyta jako nazwa tabeli.
@JoinTable
Określa tabelę łączącą w relacji wiele-do-wielu. Można w niej określić nazwę tabeli, kolumny łączące itp.
@JoinColumn
Określa nazwę kolumny, której używa się do łączenia w relacjach.
@Transient
Oznacza, że dane pole nie powinno być utrwalane ani mapowane do bazy danych.
@GeneratedValue
Określa strategię generowania wartości dla klucza głównego.
Strategia Squence
Strategia SEQUENCE używa sekwencji bazy danych do generowania kluczy głównych.
Wymaga określenia nazwy sekwencji. Jest to popularne podejście w bazach danych takich jak Oracle.
@Id **@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq_gen") @SequenceGenerator(name = "my_seq_gen", sequenceName = "MY_SEQ")** private Long id;
Strategia Identity
Strategia IDENTITY polega na pozostawieniu generowania klucza głównego bazie danych, która używa kolumny autoinkrementacyjnej.
Jest to popularne w bazach danych takich jak MySQL czy MS SQL Server.
Strategia table
Strategia TABLE polega na używaniu oddzielnej tabeli w bazie danych do przechowywania wartości klucza głównego dla każdej encji.
Tabela zawiera wartość klucza, który ma być użyty następnie.
@Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "table_gen") @TableGenerator(name = "table_gen", table = "ID_GEN_TABLE", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", pkColumnValue = "NEXT_ID", allocationSize = 1) private Long id;
Co to jest HQL?
- HQL (Hibernate Query Language) zapytań specyficzny dla Hibernate.
- operuje on na obiektach i ich właściwościach zamiast bezpośrednio na tabelach i kolumnach baz danych.
Jakie są główne cechy HQL?
- Operuje na obiektach, nie tabelach.
Jest niezależny od konkretnej bazy danych. - Obsługuje zaawansowane funkcje, takie jak stronicowanie i joiny.
- Obsługuje parametryzowane zapytania.
Jak w HQL odwołuje się do obiektów i ich właściwości?
W HQL odwołania kierowane są do nazw klas (np. “FROM Student”) i ich właściwości (np. “s.age > 18”), a nie bezpośrednio do nazw tabel i kolumn baz danych
Co to jest “transient” w kontekście cyklu życia encji w Hibernate?
- obiekt został stworzony, ale nie jest jeszcze skojarzony z sesją Hibernate
- nie ma reprezentacji w bazie danych.
- Jest to początkowy stan obiektu.
- jeśli nie zapiszemy to utracimy
- gdy aplikacja przestanie się odwoływać bedzie garbage collected
Co oznacza stan “persistent” encji w Hibernate?
- obiekt jest skojarzony z sesją Hibernate
- jest bazie danych
-Wszelkie zmiany w obiekcie będą automatycznie zsynchronizowane z bazą danych, o ile sesja jest otwarta.
Jakie jest znaczenie stanu “detached” dla encji w Hibernate?
- obiekt był wcześniej skojarzony z sesją Hibernate (był w stanie “persistent”), ale sesja została zamknięta. (kontekt utrwalania)
- Obiekt nadal ma identyfikator i może być ponownie załączony do nowej sesji.
Jak przenieść encję z stanu “detached” do “persistent”?
można użyć metod takich jak **merge()
Co się dzieje z encją w stanie “persistent”, gdy sesja Hibernate jest zamykana?
- , obiekt przechodzi ze stanu “persistent” do stanu “detached
- modyfikowany w trakcie życia sesji, te zmiany są zapisywane w bazie danych przed zamknięciem
- Po zamknięciu sesji obiekt w stanie “detached” nadal może być używany, modyfikowany itp. w kodzie aplikacji. Jednakże wszelkie zmiany dokonane w obiekcie w stanie “detached” nie będą miały wpływu na bazę danych, chyba że obiekt ten zostanie ponownie dołączony do nowej sesji (na przykład poprzez użycie metody merge()).
Co to jest problem N+1 w kontekście ORM?
- ORM wykonuje zbyt wiele zapytań do bazy danych podczas ładowania powiązanych obiektów.
Dla jednego głównego zapytania do bazy danych (1) oraz dodatkowych zapytań dla każdego powiązanego obiektu (N), łącznie wykonuje się N+1 zapytań.
- Jest to nieefektywne i może prowadzić do spowolnień w aplikacji.
Jak rozwiązać problem N+1 w Hibernate?
- UżywanieJOIN FETCH w HQL lub kryteriach zapytania.
- Ustawienie strategii ładowania na EAGER dla powiązanych obiektów (chociaż to może prowadzić do innych problemów z wydajnością, jeśli nie jest używane ostrożnie).
- Używanie BatchSize do określenia liczby obiektów ładowanych w jednym zapytaniu.
Przykład N + 1
Jeśli zapytamy o listę użytkowników i dla każdego z nich zapytamy o jego adresy, pojawi się problem N+1.
Jeśli mamy 50 użytkowników w bazie danych, powyższy kod spowoduje wykonanie 51 zapytań do bazy danych:
- Zapytanie, żeby pobrać wszystkich użytkowników (from User).
- Dla każdego użytkownika zostanie wykonane oddzielne zapytanie, aby pobrać jego adresy.
Fetch Type: Eager
- Gdy encja jest ładowana, wszystkie jej powiązane obiekty są ładowane jednocześnie,
- niezależnie od tego, czy są one bezpośrednio używane w danym momencie czy nie.
- hibernate generuje joina
Wady i zalety Eager
Zalety:
Unikanie problemu N+1 w określonych przypadkach.
Dane są od razu dostępne bez konieczności dodatkowego ładowania.
Wady:
Może prowadzić do nadmiernego ładowania danych, które nie są potrzebne, co wpływa na wydajność.
Jeśli dane są zawsze ładowane, nawet gdy nie są potrzebne, może to prowadzić do niepotrzebnego obciążenia systemu.
- problem iloczynu kartezjanskiego