1 / 33

Hibernate ;-)

Hibernate ;-). Zpiratował Rafał Kaczyński. Hibernate – mapowanie baz danych. 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. Cechy. open source

gitel
Download Presentation

Hibernate ;-)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Hibernate ;-) Zpiratował Rafał Kaczyński

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

  3. Cechy • opensource • 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. Hibernatetools)

  4. Interfejsy w Hibernate • Mozemypodzielic na grupy: • Interfejsy do wykonywania operacji CRUD: • Session, Transaction, Query • Interfejs słuzacy do konfiguracji hibernate: Configuration • Interfejsy słuzace do obsługi zdarzenhibernate (callback): • Interceptor, Lifecycle, Validatable • Interfejsy pozwalajacerozszerzycfunkcjonalnosc mapowania: • UserType, CompositeUserType, IdentifierGenerator • Hibernate korzysta takze z: • JDBC • Java Transaction API (JTA) • Java naming and Directory Services (JNDI)

  5. Kluczowe interfejsy • 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 • Moznamyslec, ze jest kanał do bazy wraz z buforem obiektów • Nazywany tez czasami zarzadcatrwałosci (umozliwia m.in. na pobieranie i utrwalanie obiektów)

  6. Kluczowe interfejsy • 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

  7. Kluczowe interfejsy • 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 zarzadzactransakcjami (Możemy ją odwołać lub zatwierdzić tx.commit(); tx.rollback() ;)

  8. Kluczowe interfejsy • 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 konteksciejakiejs sesji

  9. Kluczowe interfejsy • Interfejsy wywołan zwrotnych • Interfejsy pozwalajaprzechwytywac 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

  10. Kluczowe interfejsy • 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

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

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

  13. Przykład cd public void simpleFunction () { // 3. Otwarciesesji Hibernate Session session = factory.openSession(); // 4. Rozpoczęcie transakcji Transactiontx = 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ęciesesji Hibernate session.close(); }}

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

  15. hibernate.cfg.xml hibernate-configuration> <session-factory> <property name="connection.driver_class"> org.hsqldb.jdbcDriver </property> <property name="connection.url">jdbc:hsqldb:data/tutorial</property> <property name="connection.username">sa</property> <property name="connection.password"></property> <property name="dialect">org.hibernate.dialect.HSQLDialect </property> <property name="show_sql">true</property> <mapping resource="Class.hbm.xml"/> </session-factory> </hibernate-configuration>

  16. hibernate.cfg.xml 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: • <property name="hbm2ddl.auto">create</property> - przy starcie aplikacji tworzy strukturę bazy danych

  17. Pliki mapujące 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.

  18. Podstawowe elementy pliku mapującego: <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

  19. Podstawowe elementy pliku mapującego: <many-to-one name="owner" class="cat.model.Owner" not-null="true" > <columnname="ID_OWNER" /> </many-to-one> 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

  20. Tworzenie, zapisywanie i ładowanie obiektów Ł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().

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

  22. Mapowanie (*hbm.xml) Mapowanie polega na odwzorowaniu obiektu na dany rekord w bazie. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mappingpackage="p"> <classname="User" table="User"> <id name="id"><generatorclass="native"/></id> <property name="imie" column="IMIE" length="10" not-null="true"/> <property name="nazwisko" column="NAZWISKO" length="25" not-null="true"/> <property name= " wiek" column= " WIEK" not-null="true"/> </class> </hibernate-mapping>

  23. Hibernate – mapowanie cd • 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.

  24. HQL 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'

  25. HQL - generowanie zapytań Wybieramy koty o imieniu Miau: select c fromCat c wherec.name='Miau' order by c.id Wybieramy koty, których właściciel ma na imię Jan: select c fromCat c wherec.owner.name = 'Jan' Wybieramy koty z właścicielami: select c, o fromCat c, Owner o wherec.owner.id= o.id Tabele w zapytaniach zawsze muszą być aliasowane!

  26. HQL - generowanie zapytań Mając obiekt Session możemy wykonać zapytanie w następujący sposób: Session session; Query q = session.createQuery("select c fromCat c wherename = :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.

  27. HQL - generowanie zapytań Możemy także używać funkcji agregujących: select max(c.age) fromCat c • I następnie np. • q= session.createQuery("select max(c.age) fromCat„ ); • Integerres = (Integer) q.uniqueResult() Ostatnia metoda daje wyjątek, gdy zapytanie zwraca więcej niż jeden rekord.

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

  29. Narzędzia 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.

  30. Middlegen 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).

  31. HibernateSynchronizer 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.

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

  33. KONIEC

More Related