Data powstania: 2001 rok Autor i lider: Gavin King Najnowsza wersja: Licencja: Open Source
Hibernate Hibernate jest obiektowym narzędziem dostępu do bazy danych. Hibernate pozwala tworzyć klasy odpowiadające tabelkom w bazie danych. Umożliwia modelowanie relacji, dziedziczenia, polimorfizmu, kompozycji i kolekcji. W Hibernate mamy możliwość wykonywania SQL- owych zapytań do bazy danych. Udostępnia też własny język zapytań (HQL), który dorównuje możliwościami SQL-owi, a przewyższa go pod względem przejrzystości.
Hibernate to technologia O/RM dla Javy – Z uwzględnieniem asocjacji, kompozycji, dziedziczenia, polimorfizmu, kolekcji Funkcjonalność Hibernate: – Odwzorowanie klas Javy na tabele w bazie danych I typów danych Javy na typy danych SQL – Dostarczanie mechanizmów wykonywania zapytań do bazy danych Pozwala uniknąć ręcznego zarządzania danymi na poziomie SQL i JDBC Wg dokumentacji celem Hibernate jest zwolnienie projektanta aplikacji z konieczności ręcznego kodowania 95% zadań związanych z zapewnieniem trwałości danych
Hibernate jest najbardziej odpowiedni dla aplikacji Java pracujących w warstwie pośredniej, Rozpowszechniany na licencji FSF Lesser Gnu Public License Najpopularniejsza obecnie implementacja odwzorowania obiektowo - relacyjnego dla Javy – Dużo materiałów i pomocy w Internecie – Udział twórców Hibernate w pracach nad specyfikacją EJB 3.0
Część konfiguracyjna Część konfiguracyjna, a więc całość plików do konfiguracji zawarta jest w jednym pliku, najczęściej o nazwie hibernate.cfg.xml, Wiele klas mapowanych Wiele klas mapowanych, tabele w bazie danych, np. Person.java, Contakt.java. Najczęściej takie klasy posiadają dużą ilość atrybutów, a dla każdego z nich przyporządkowane są metody: set ( ) oraz Get ( )), XML – owe mappingi XML – owe mappingi powyższych klas - to właśnie w nich można znaleźć opisy, w jaki sposób te klasy mogą ulec procesowi mapowania na poszczególne tabele w bazie danych. Jedna lub więcej klas Jedna lub więcej klas, które odwołują się do bazy danych, oraz tych, które wykorzystują z interfejsów takich jak: Transaction, Query, SessionFactory, Configuration, Session.
Interfejs Session Interfejs Session – jest głównym interfejsem każdej aplikacji Hibernate. Projekty Session można uznać za lekkie, ponieważ ich koszt utworzenia, a także zniszczenia nie jest wielki. A więc jest to szczególnie ważny aspekt, ponieważ każda aplikacja nieustannie usuwa, a następnie tworzy coraz to nowsze sesje. Znaczenie sesji Hibernate można nazwać jako zjawisko między połączeniem i transakcją. Interfejs SessionFactory Interfejs SessionFactory – aplikacja zajmuje się pobieraniem egzemplarzy Session z SessionFactory. Interfejs SessionFactory nie można określić jako lekki, ponieważ został utworzony z myślą o współpracy przez większą ilość aplikacji. Często zdarza się tak, że na całą aplikację pojawia się tylko jeden obiekt SessionFactory, który powstaje w czasie procesu inicjalizacji. W przypadku, kiedy aplikacja wykorzystuje kilka baz danych wraz z Hibernate, to wtedy jest potrzebny osobny obiekt SessionFactory dla poszczególnej bazy danych.
Interfejs Transaction Interfejs Transaction – stara się ukryć szczegóły implementacji konkretnych mechanizmów transakcyjnych: JDBC, klasy UserTransaction z JTA lub nawet transakcji COBRA. Ma to na celu ułatwienie przenośności aplikacji Hibernate pomiędzy różnorodnymi środowiskami wykonywania i kontenerami. Aplikacje Hibernate nie są zmuszone korzystać z interfejsu Transaction, jeżeli chcą zarządzać transakcjami we własnym zakresie. Interfejs Query Interfejs Query – ma na celu umożliwić proces wysyłania zapytań do bazy danych oraz sterowanie procesem ich realizowania. Takie zapytania należy pisać w języku WQL albo językiem odpowiednim dla poszczególnej bazy danych dialekcie SQL. Egzemplarz Query jest odpowiedzialny za zmniejszenie liczby zwracanych wyników i o wykonanie zapytania. Interfejs Configuration Interfejs Configuration – służy on do konfiguracji i uruchomienia Hibernate. A więc aplikacja korzysta z egzemplarza Configuration do ustalenia położenia dokumentów odwzorowań i właściwości charakterystycznych dla Hibernate.
Dowolna klasa może reprezentować encje Wygodne i intuicyjne mapowanie z wykorzystaniem plików XML lub adnotacji (od Hibernate 3.0) Automatyczna optymalizacja = wydajność Mniej kodu = mniej błędów Proste zasady działania Możliwość korzystania z możliwości SQL bez wychodzenia poza granicę języka Java Możliwość stworzenia dużej bazy bez większego wkładu pracy Dostepność narzędzi open source Popularność
Wsparcie techniczne oraz dokumentacja Hibernate, które można znaleźć w Internecie można określić jako niewystarczająca, Posiada wiele usterek, Dla złożonych danych, proces mapowania danych z obiektu do tabeli i odwrotnie, zmniejsza wydajność, powodując tym samym wydłużenie czasu konwersji, Hibernate nie pozwala korzystać z poszczególnych zapytań, których można używać w JBDC, na przykład nie można wstawić dużej liczby obiektów do jednej i tej samej tabeli za pomocą jednego zapytania.
Plik Message.java – prosta klasa trwałości Package hello; Public class Message { Private Long id; Private String text; Private Message nextMessage; Private Message () {} Public Message String text) { This.text = text; } Public Long getId () { Return id; } Atrybut identyfikatora Treść komunikatu Referencja do innego komunikatu
Private void setId(Long id) { This.id = id; Public String getText () { Return text; } Privatte void setText(String text) { This.text = text; } Public Long getNextMessage() { Return nextMessage; } Private void setnNextMessage(Long nextMessage) { This.nextMessage = nextMessage; }
Wyświetlenie na konsoli napisu Witaj świecie Message message = new Message("Witaj świecie"); System.out.println(message.getText()); Zapisywanie obiektu Message do bazy danych Session session = getSessionFactory( ).openSession(); Transaction tx = session.beginTransaction( ); Message message = new Message("Witaj świecie"); Session.save(message); Tx.commit ( ); Session.close ( );
Przekazanie do bazy danych polecenia SQL Insert into MESSAGE (MESSAGE_ID, MESSAGE_TEXT_NEXT_MESSAGE_ID) values (1, "Witaj świecie", null) Transaction tx = session.beginTransaction( ); Message message = new Message(Witaj świecie); Session.save(message); Tx.commit ( ); Session.close ( );
Pobieranie z bazy danych wszystkich komunikatów w kolejności alfabetycznej oraz wyświetlanie ich zawartości Session newSession = getSessionFactory ( ).openSession ( ); Transaction newTransaction = newSession.beginTransaction( ); List messages = newSession.finf("from Message as m order by m.text asc"); System.out.println("Znalezionych komunikatów: " + messages.size ( )); For (Iterator iter = messages.iterator( ); iter.hasNext( ); ) { Message message = (Message) iter.next( ); System.out.println(message.getText( )); } NewTransaction.commit( ); newSession.close( );
Przekształcenie zapytania na kod SQL w chwili wywoływania metody find( ). Select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID From MESSAGES m Order by m.MESSAGE_TEXT asc Znalezionych komunikat ó w: 1 Witaj świecie Taki kod powoduje wyświetlenie na konsoli napisu:
Prosty plik odwzorowania Hibernate w postaci XML <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <many-to-one name="nextMessage" cascade="all" column="NEXT_MESSAGE_ID" />
Główną zaletą Hibernata, jest jego prostota i łatwość użycia. Dzięki niemu nie trzeba pisać setek poleceń w SQLu. Hibernate robi to za nas. Poza tym jest intuicyjny i łatwy do nauki. Wydaję się on być najlepszą technologią umożliwiającą dostęp do bazy danych, występującą obecnie na rynku.
Bauer Ch., King G.: Hibernate w akcji, popraw wydajność aplikacji bazodanowych w Javie, Wydawnictwo HELION, Gliwice Minter D., Linwood J.: Hibernate od Nowicjusza do Profesjonalisty, Polish edition Copyright © 2007 by PowerNet article&id=14:hibernate-wprowadzenie&catid=8:hibernate&Itemid=7http://czajkowski.waw.pl/html/groovygrails/index.php?option=com_content&view= article&id=14:hibernate-wprowadzenie&catid=8:hibernate&Itemid= ephttp:// ep %E2%80%93-baza-danych-walidacja-wiadomosci-encje-hibernate/ %E2%80%93-baza-danych-walidacja-wiadomosci-encje-hibernate/