Zpiratował Rafał Kaczyński. Jest to technologia pozwalająca mapować dane obiektowe na odpowiadające im struktury w bazach danych. Hibernate pozwala na.

Slides:



Advertisements
Podobne prezentacje
Wstęp do strumieni danych
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
Programowanie obiektowe
Zaawansowane metody programowania – Wykład V
Odwzorowanie obiektowo-relacyjne
Implementacja ekstensji klasy
Marcin Pamuła Mateusz Stefek
Wycofywanie potwierdzonych transakcji
Model – View - Controler
Data powstania: 2001 rok Autor i lider: Gavin King Najnowsza wersja: Licencja: Open Source.
ODE Informacje wstępne. Pojęcia podstawowe n Obiektowa baza danych u język komunikacji u ziarnistość obiektów u identyfikacja obiektów n Transakcja -
Odwzorowania relacyjno-obiektowe Hibernate Tranzakcyjność i bezpieczeństwo danych.
Obiektowe metody projektowania systemów
Obiektowe metody projektowania systemów Command Pattern.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Wykład 8 Wojciech Pieprzyca
Enteprise Java Beans Emil Wcisło.
.NET Remoting Łukasz Zawadzki.
Język Java Wielowątkowość.
Spring podstawy.
Hibernate uzupełnienie
Odwzorowania relacyjno-obiektowe Hibernate Tranzakcyjność i bezpieczeństwo danych.
System katalogowania. Opis i architektura.
Message-Driven Bean.
Instytut Tele- i Radiotechniczny WARSZAWA
Podstawy programowania
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
Wirtualna baza SQL zgodna z SQL Server SQL as a Service
ASP BAZY. 2.2 S. Wolek Wst. do Inf. Połączenie z bazą danych przez ADO (ActiveX Data Object) do: - źródła ODBC - bazy z podanie nazwy sterownika ODBC.
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Java – coś na temat Klas Piotr Rosik
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Wybrane zagadnienia relacyjnych baz danych
Sieć oparta o serwer Ubuntu 12.10
Programowanie obiektowe 2013/2014
Komendy SQL do pracy z tabelami i bazami
Programowanie w języku C++
Marcin nowak, Wojciech baszczyk
System plików.
Piotr Czapiewski Wydział Informatyki ZUT Wykład 2.
Informatyka Stosowana – ROK II / III
Hibernate Podstawy.
XML w bazach danych.
Odwzorowania relacyjno-obiektowe Hibernate Podstawy.
Paweł Starzyk Obiektowe metody projektowania systemów
Waldemar Bartyna 1 Programowanie zaawansowane LINQ to XML.
.NET i Bazy Danych Projekt: Wadim Grasza.
Wzorce Projektowe w JAVA
Object-relational mapping (aka O/RM, ORM, and O/R mapping)
Architektura Rafał Hryniów. Architektura Wizja projektu systemu, którą dzielą twórcy Struktura komponentów systemu, ich powiązań oraz zasad i reguł określających.
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
Zarządzanie stanem w aplikacjach ASP.NET Elżbieta Mrówka-Matejewska
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Temat: Tworzenie bazy danych
Sławomir Civic Białek HIBERNATE.
Wątki, programowanie współbieżne
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
Programowanie obiektowe – zastosowanie języka Java SE
Wstęp - Prosta aplikacja internetowa w technologii Java EE 5
PGO Interfejsy Michail Mokkas.
PGO - Projektowanie i implementacja pierwszych klas
Programowanie w Javie 1 Dr Robert Kowalczyk
Modele baz danych - spojrzenie na poziom fizyczny
Zapis prezentacji:

Zpiratował Rafał Kaczyński

Jest to technologia pozwalająca mapować dane obiektowe na odpowiadające im struktury w bazach danych. Hibernate pozwala na dostęp do relacyjnej bazy danych z poziomu języka Java.

open source intuicyjne mapowanie tabel na klasy (za pomocą plików xml) mniejsza ilość kodu prostota możliwość korzystania z języka SQL HQL, Criteria narzędzia wspomagające (np. Hibernate tools)

Mozemy podzielic na grupy: Interfejsy do wykonywania operacji CRUD: Session, Transaction, Query Interfejs słuzacy do konfiguracji hibernate: Configuration Interfejsy słuzace do obsługi zdarzen hibernate (callback): Interceptor, Lifecycle, Validatable Interfejsy pozwalajace rozszerzyc funkcjonalnosc mapowania: UserType, CompositeUserType, IdentifierGenerator Hibernate korzysta takze z: JDBC Java Transaction API (JTA) Java naming and Directory Services (JNDI)

Session- sesja, pewna jednostka pracy Jeden z podstawowych interfejsów Koszt jego utworzenia i usuniecia jest niewielki szczególnie w przypadku aplikacji Webowych obiekt będzie tworzony i niszczony przy kazdym zadaniu Mozna myslec, ze jest kanał do bazy wraz z buforem obiektów Nazywany tez czasami zarzadca trwałosci (umozliwia m.in. na pobieranie i utrwalanie obiektów)

SessionFactory - fabryka sesji pozwala na otwarcie sesji. Najczęściej wywołuje ją się w bloku statycznym. W całej aplikacji wywołuje się ją raz za pomocą metody: Configuration.buildSessionFactory() Słuzy do tworzenia obiektów Session Jego utworzenie jest dosyc kosztowne i zalecane jest utworzenie jednej instancji dla całej aplikacji W przypadku dostepu do wielu baz, dla kazdej potrzebna bedzie osobna instancja Ten obiekt korzysta o plików mapujacych oraz tworzy odpowiednie struktury i zapytania SQL

Configuration- Configuration.configure() - pierwszy krok, odnalezienie pliku konfiguracyjnego (plik pobierany z zasobów) Słuzy do konfiguracji i uruchomienia hibernate Wczytuje plik konfiguracyjny Pierwszy obiekt zwiazany w hibernate Transaction - jeszcze mniejsza jednostka pracy (musi być zainicjalizowana sesja) Opcjonalny w uzyciu Pozwala samodzielnie zarzadzac transakcjami (Możemy ją odwołać lub zatwierdzić tx.commit(); tx.rollback() ;)

Query i Criteria Query pozwala zadawac zapytania w jezyku HQL lub SQL Criteria jest podobny, ale pozwala zadawac zapytania zorientowane obiektowo Interfejsy działaja zawsze w kontekscie jakiejs sesji

Interfejsy wywołan zwrotnych Interfejsy pozwalaja przechwytywac zdarzenia takie jak zapisanie, wczytanie, czy usuniecie obiektu Obiekty mogły implementowac interfejsy Lifecycle i Validatable, ale uznano to za zły kierunek i nie jest zalecane Zalecane jest uzywanie interfejsu Interceptor, którego uzycie nie wymaga implementacji czegokolwiek w samych obiektach biznesowych

Typy Hibernate ma własny zestaw typów wbudowanych, które dobrze koreluje z typami w jezyku Java Hibernate pozwala takze na tworzenie własnych typów poprzez interfejsy UserType i CompositeUserType

Interfejsy rozszerzen Hibernate daje mozliwosc implementacji interfejsów, dzieki którym mozemy zastapic domyslne zachowanie samodzielnie napisanym kodem. Co mozemy zaimplementowac? Generowanie wartosci klucza głównego (interfejs IdentifierGenerator) Dialekt SQL-a (klasa abstrakcyjna Dialect) Strategie buforowania (interfejsy cache i CacheProvider)

public class HibernateExample { private final static SessionFactory factory; static { // 1. Inicjalizacja Hibernate Configuration cfg = new Configuration().configure(); // 2. Utworzenie fabryki sesji Hibernate factory = cfg.buildSessionFactory(); } public static void main(String[] args) { HibernateExample m = new HibernateExample(); m.simpleFunction(); }

public void simpleFunction () { // 3. Otwarcie sesji Hibernate Session session = factory.openSession(); // 4. Rozpoczęcie transakcji Transaction tx = session.beginTransaction(); // 5. Utworzenie użytkownika User u = new User(); u.setImie("Jan"); u.setNazwisko("Nowak"); // 6. Zapisanie użytkownika w bazie danych session.save(u); // 7. Zatwierdzenie transakcji tx.commit(); // 8. Zamknięcie sesji Hibernate session.close(); }}

Do korzystania z Hibernate potrzebne są następujące składniki: biblioteka :) plik konfiguracyjny hibernate.cfg.xml pliki mapujące *.hbm.xml

hibernate-configuration> org.hsqldb.jdbcDriver jdbc:hsqldb:data/tutorial sa org.hibernate.dialect.HSQLDialect true

Pola w pliku konfiguracyjnym są dosyć intuicyjne. Najważniejsze to podanie: - sterownika, - adresu bazy - użytkownika i hasła - dialektu - klas mapujących (pliki *.hbm.xml) show_sql – pozwala wypisać komendy na konsolę Dodatkowe opcje: create - przy starcie aplikacji tworzy strukturę bazy danych

Te pliki zawierają właściwy opis mapowania, czyli tłumaczenia relacyjnego opisu danych na obiektowy i na odwrót. Zwykle plik *.hbm.xml odpowiada jednej klasie bądź tabeli. Dzieje się tak zwłaszcza wtedy gdy mamy prostą strukturę, gdzie tabele odpowiadają bezpośrednio klasom.

<class name="cat.model.Cat" table="CAT" > ten element określa klasę i tabelę której dotyczy mapowanie <property name="nick" type="java.lang.String" column="NICK" length="100 /> ten element opisuje pojedyncze pole i odpowiadającą mu kolumnę w tabeli

<many-to-one name="owner" class="cat.model.Owner" not-null="true" > Tu mamy przykład opisu relacji wiele-do-jeden - każdy kot ma swojego właściciela. Możliwe są oczywiście bardziej skomplikowane mapowania. W szczególności Hibernate wspiera różnego rodzaju dziedziczenie

Ładowanie obiektu z bazy. Jeżeli znamy identyfikator obiektu to możemy go załadować z bazy. Służą do tego dwie metody: Cat c = (Cat) session.load(Cat.class, id); c = (Cat) session.get(Cat.class, id); Jak widać, podajemy klasę i identyfikator i dostajemy obiekt, który musimy zrzutować na odpowiednią klasę. Semantyka metod różni się zachowaniem gdy nie ma elementu w bazie z tym identyfikatorem. Wtedy get zwraca null, zaś load - wyjątek Modyfikacja obiektu. Jeżeli załadowaliśmy obiekt z bazy (jest persystentny), to wszystkie modyfikacje są śledzone przez Hibernate i na końcu sesji (przy session.close()) zostaną zapisane. Jeżeli chcemy wymusić wcześniejsze zapisanie zmian to sesja ma metodę flush().

Zapisywanie obiektu: Jeżeli utworzyliśmy nowy obiekt to jest on w stanie transient. Aby zapisać go do bazy musimy wywołać. Cat c = new Cat(); c.setName("pus"); session.save(c); Metoda ta zwraca nowy identyfikator jaki został nadany obiektowi (gdy identyfikator jest generowany np. przez sekwencję).

Mapowanie polega na odwzorowaniu obiektu na dany rekord w bazie. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "

Znacznik class zawiera m. in. atrybuty name, który odpowiada klasie oraz table określający nazwę tabeli. Pomiędzy znacznikiem class znajduje się właściwe mapowanie pól klasy na odpowiadające im kolumny w bazie danych. Wymaganym znacznikiem jest id, który odpowiada za klucz główny, znaczniki property odpowiadają poszczególnym kolumną. Atrybuty znacznika property pozwalają na przykład określić rozmiar pola, możliwość przyjmowania wartości nullowych, typ złącznia itp.

HQL jest obiektowym odpowiednikiem języka SQL rozumiejącym takie aspekty jak dziedziczenie czy polimorfizm. HQL jest wrażliwy na rozmiar liter tylko jeśli chodzi o nazwy klas bądź pól, w pozostałych przypadkach SeLeCt == SELECT SELECT AVG(us.wiek), SUM(us.wiek), MAX(us.wiek), COUNT(us) FROM User AS us WHERE us.imie=Jan'

Wybieramy koty o imieniu Miau: select c from Cat c where c.name='Miau' order by c.id Wybieramy koty, których właściciel ma na imię Jan: select c from Cat c where c.owner.name = 'Jan' Wybieramy koty z właścicielami: select c, o from Cat c, Owner o where c.owner.id= o.id Tabele w zapytaniach zawsze muszą być aliasowane!

Mając obiekt Session możemy wykonać zapytanie w następujący sposób: Session session; Query q = session.createQuery("select c from Cat c where name = :id"); q.setString("id", "Miau"); //ustalamy parametry (możemy je także wpisać bezpośrednio) q.setFirst(0); //ustalamy od którego rekordu chcemy zapytania q.setMaxList(10); //ustalamy ile maksymalnie chcemy wyników List result = q.list() Lista zawiera teraz obiekty typu Cat.

Możemy także używać funkcji agregujących: select max(c.age) from Cat c I następnie np. q= session.createQuery("select max(c.age) from Cat ); Integer res = (Integer) q.uniqueResult() Ostatnia metoda daje wyjątek, gdy zapytanie zwraca więcej niż jeden rekord.

Hibernate pozwala na korzystanie również z czystego języka zapytań SQL. List users = sess.createSQLQuery( "SELECT {us.*} FROM user us WHERE us.wiek = 17).list();

Samodzielne generowanie plików mapujących jest oczywiście dość uciążliwe. Dostępnych jest kilka narzędzi, które potrafią wygenerować ze schematu bazy danych zarówno pliki mapujące jak i odpowiednie klasy.

Jest to narzędzie służące do szeroko pojętego "przekładania" języka relacyjnych baz danych na języki obiektowe. W szczególności ma wbudowany plug-in, pozwalający na generowanie plików mapujących. Można także dołączyć odpowiednie zadanie dla anta, pozwalające na generowanie kodu źródłowego (nazywa się hbm2java).

Jest to plug-in do eclipse, pozwalający na dodawanie plików mapujących, konfigurację i generowanie kodu klas, jak również generowanie schematu bazy na podstawie plików mapujących. Funkcjonalność jest jak widać bogatsza niż dla middlegena, jednak projekt jest rozwojowy i wiele rzeczy nie działa najlepiej.

Xdoclet zawiera zestaw anotacji (hibernate) i odpowienie zadanie (hibernatedoclet) pozwalające na generowanie plików mapujących na podstawie kodu klas.