Przede wszystkim należy zrozumieć, że Hibernate "tylko" 😁 opakowuje interfejs takie jak JDBC czy JTA dając tym samym możliwość pracy użytkownikowi na relacyjnej bazie danych w taki sposób jakby baza była obiektowa. Takie podejście z jednej strony daje szybką i elastyczną możliwość wykonywania operacji na bazie danych z drugiej strony wprowadza pewne minimalne opóźnienia w tych operacjach. Do podstawowych interfejsów w Hibernejcie należą:
✅ Configuration
Obiekt "Configuration" służy do konfiguracji i uruchomienia Hibernejta.
Cechy obiektu "Configuration":
- wczytywanie danych z pliku konfiguracyjnego
- dodawanie adnotacji encji
- tworzenie obiektów "SessionFactory"
- stworzenie obiektu Configuration
- wczytanie konfiguracji z pliku "hibernate.cfg.xml"
- dodanie klasy encji czyli mapy tabeli "owner"
- dodanie klasy encji czyli mapy tabeli "car"
- stworzenie SessionFactory
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import myhibernate.onedirection.entity.Car;
import myhibernate.onedirection.entity.Owner;
public class AddOneToManyApp {
public static void main(String[] args) {
1. Configuration conf = new Configuration();
2. conf.configure("hibernate.cfg.xml");
3. conf.addAnnotatedClass(Owner.class);
4. conf.addAnnotatedClass(Car.class);
5. SessionFactory factory = conf.buildSessionFactory();
Session session = factory.getCurrentSession();
Owner owner = new Owner();
owner.setFullName("Michał Kowal");
Car car1 = new Car("BMW");
Car car2 = new Car("MERCEDES");
owner.AddCar(car1);
owner.AddCar(car2);
factory.close();
}
}
✅ SessionFactory
Obiekt "SessionFactory" tworzony jest tylko raz dla jednej bazy danych, jego zadaniem jest tworzenia obiektów "Session". "SessionFactory" jest bezpieczny wątkowo.
Cechy obiektu "SessionFactory":
- ciężki obiekt, stworzenie go zabiera sporo czasu
- jedna instancja w aplikacji
- tworzenie obiektów "Session"
- bezpieczny wątkowo
- stworzenie obiektu SessionFactory
- stworzenie obiektu Session
- zamknięcie obiektu SessionFactory
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import myhibernate.onedirection.entity.Car;
import myhibernate.onedirection.entity.Owner;
public class AddOneToManyApp {
public static void main(String[] args) {
Configuration conf = new Configuration();
conf.configure("hibernate.cfg.xml");
conf.addAnnotatedClass(Owner.class);
conf.addAnnotatedClass(Car.class);
1. SessionFactory factory = conf.buildSessionFactory();
2. Session session = factory.getCurrentSession();
Owner owner = new Owner();
owner.setFullName("Michał Kowal");
Car car1 = new Car("BMW");
Car car2 = new Car("MERCEDES");
owner.AddCar(car1);
owner.AddCar(car2);
3. factory.close();
}
}
✅ Session
"Session" to obiekt reprezentujący jednostkę pracy z bazą danych ("unity of work"). "Session" jako zarządca trwałości daje nam dostęp do podstawowych operacji zapisu i odczytu obiektów. Generalnie jeden obiekt "Session" odpowiada jednemu połączeniu Connection z interfejsu JDBC. Można przyjąć że stworzony egzemplarz "Session" jest czymś pomiędzy połączeniem a transakcją w bazie danych.
Cechy obiektu "Session":
- lekki do stworzenia i zniszczenia
- ma krótki czas życia
- służy do opakowywania połączenia z bazą danych
- nie jest bezpieczny wątkowo
Sesje można traktować jak buffor załadowanych obiektów związanych z bazą danych. Wszystkie zmiany na sesji mogą być odwzorowane (czyli zapisane) w bazie danych. Logicznie rzecz biorąc "sesja" może wykonać kilka transakcji w swoim obrębie.
- stworzenie obiektu session
- otwarcie połączenia
- wykonanie operacji w pamięci hibernate
- zapisanie w bazie danych
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import myhibernate.onedirection.entity.Car;
import myhibernate.onedirection.entity.Owner;
public class AddOneToManyApp {
public static void main(String[] args) {
Configuration conf = new Configuration();
conf.configure("hibernate.cfg.xml");
conf.addAnnotatedClass(Owner.class);
conf.addAnnotatedClass(Car.class);
SessionFactory factory = conf.buildSessionFactory();
1. Session session = factory.getCurrentSession();
Owner owner = new Owner();
owner.setFullName("Michał Kowal");
Car car1 = new Car("BMW");
Car car2 = new Car("MERCEDES");
owner.AddCar(car1);
owner.AddCar(car2);
factory.close();
}
}
✅ Transaction
Obiekt "Transaction" odpowiada jednej transakcji bazodanowej i jest związany z konkretną sesją. Generalnie obiekt "Transaction" ma za zadanie ukryć szczegóły implementacyjne różnych mechanizmów transakcyjnych tj. JDBC czy JTA. Tworzymy go w następujący sposób:
Transaction transaction = session.beginTransaction();
następnie możemy ją zatwierdzić albo wycofać:
transaction.rollback();
transaction.commit();
Transakcja bazodanowa to jednostka zadaniowa, która zawsze kończy się zatwierdzeniem albo wycofaniem zmian, dzięki temu pozostaje operacją atomową. Oczywiście należy mieć na uwadze, że sama transakcja bazodanowa to zbiór operacji CRUD, które stanowią jedna całość i muszą spełniać zasadę ACID .
Brak komentarzy:
Prześlij komentarz