You are on page 1of 36

Hibernate – mapowanie baz danych

Jest to technologia pozwalająca mapować dane obiektowe na odpowiadające im struktury w bazach danych.

ORM - Object-to-Relational Mapping.

Jest odpowiedzią na znikomą ilość obiektowych baz danych

Hibernate pozwala na dostęp do relacyjnej bazy danych z poziomu języka Java.

cechy
- 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)

architektura

W aplikacji przechowujemy obiekty, które Hibernate za pomocą plików XML przetwarza na strukturę relacyjnej bazy danych.

W całej aplikacji wywołuje się ją raz za pomocą metody: Configuration. pewna jednostka pracy Transaction – jeszcze mniejsza jednostka pracy (musi być zainicjalizowana sesja) . Najczęściej wywołuje ją się w bloku statycznym.konfiguracja Ważne pojęcia: Configuration.buildSessionFactory() Session – sesja. konfiguracyjnego (plik pobierany z zasobów) odnalezienie pliku SessionFactory – fabryka sesji pozwala na otwarcie sesji.configure() – pierwszy krok.

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

xml) show_sql – pozwala wypisać komendy na konsolę Dodatkowe opcje: <property name="hbm2ddl.sterownika.adresu bazy .przy starcie aplikacji tworzy strukturę bazy danych . Pola w pliku konfiguracyjnym są dosyć intuicyjne.hbm.cfg.użytkownika i hasła .dialektu . .auto">create</property> .xml cd.klas mapujących (pliki *. Najważniejsze to podanie: .hibernate.

0.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.Mapowanie (*hbm.dtd"> <hibernate-mapping package="p"> <class name="User" table="User"> <id name="id"><generator class="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> .0//EN" "http://hibernate.net/hibernate-mapping-3.xml) Mapowanie polega na odwzorowaniu obiektu na dany rekord w bazie.sourceforge. <?xml version="1.

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

} } . } public void setImie(String imie) { this. } public void setNazwisko(String nazwisko) { this. private String imie. } public void setWiek(int wiek) { this.id = id.wiek = wiek. } public String getImie() { return imie.mapowanie – ziarno package p.imie = imie. } public String getNazwisko() { return nazwisko. } public void getWiek() { return wiek.nazwisko = nazwisko. private String nazwisko. private int wiek. public int getId() { return id. public final class User { private int id. } public void setId(int id) { this.

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

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

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

crit. maxWiek) ).add( Restrictions.createCriteria(User.like(„nazwisko".class) .list(). List users = crit. Nie potrzeba znać dokładnie struktury języka zapytań. minWiek. Wynik zapytania jest zwrócony w postaci listy.Hibernate – Criteria cd. „Now%") ) . Aby ją utworzyć należy w odpowiedniej metodzie podać nazwę klasy (np.add( Restrictions. Criteria pozwalają w prosty oraz intuicyjny sposób ograniczyć liczbę zwracanych rekordów. User) Criteria crit = sess.list(). List users = sess.class). .createCriteria(User.between(„wiek".setMaxResults(50).

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

1.jar cglib-2.jar commons-logging-1.jar commons-collections-2.1.jar hibernate3.3.1.1.4.Hibernate – prosty przykład Niezbędne biblioteki Hibernate: antlr-2.jar jta.1.6rc1.jar dom4j-1.0.jar ehcache-1.9.6.jar .7.0.jar hsqldb.jar c3p0-0.

cfg. na wysokości pakietu) i otworzyć w nim linię poleceń Bazę uruchamiamy za pomoca komendy java -classpath lib/hsqldb.auto">create</property> Przy zmianie struktury bazy należy go z powrotem odkomentować Na koniec należy zrestartować bazę.jar org.xml po pierwszym uruchomieniu aplikacji <property name="hbm2ddl.Hibernate – prosty przykład Będziemy korzystać z bazy HSQL DB W projekcie należy utworzyć folder data (np. wpisu w .Server Należy pamiętać o zakomentowaniu następującego hibernate.hsqldb.

hibernate.Configuration. } catch (Throwable ex) {/* błąd inicjalizacji połączenia */ } } public static final ThreadLocal SESSION = new ThreadLocal(). static { try { SESSION_FACTORY = new Configuration(). import org. .Hibernate – prosty przykład cd.p. public final class HibernateUtil { private HibernateUtil() {} private static final SessionFactory SESSION_FACTORY.hibernate.Session.HibernateException. HibernateUtil. import org.lodz. import org.hibernate.configure().SessionFactory. import org.java Plik do zarządzania sesją.buildSessionFactory().hibernate.cfg. otwierania i zamykania fabryki package pl.

} } .close().openSession(). if (s != null) s.get().set(null).java public static Session currentSession() throws HibernateException { Session s = (Session)SESSION. SESSION. } return s.Hibernate – prosty przykład cd.get(). } public static void closeSession() throws HibernateException { Session s = (Session)SESSION. HibernateUtil.set(s). SESSION. if (s == null) { s = SESSION_FACTORY.

Serializable. import pl.lodz.io.lodz. public class EventManager { . import java.*. import org.p.hibernate.User.*.util.p. import java.java Plik do połączeń z bazą danych Znajdują się tam wszystkie niezbędne metody package pl.EventManager.

out. tx = session.currentSession(). } catch (Exception ex) { if (tx != null) tx. } . session.parseLong( ser.rollback(). return id. try { Session session = HibernateUtil. tx.save( obj ). throw ex. id = -1.toString() ).closeSession().EventManager. System.java public long insertRecord(Object obj) throws Exception { long id = -1.commit(). } finally HibernateUtil. Transaction tx = null.getIdentifier(obj). if (ser != null) id = Long. Serializable ser = session.beginTransaction().println("-> Koniec insertRecord").

boolean useTx) throws Exception { Object obj = null. } finally { HibernateUtil.beginTransaction().EventManager. } catch (Exception ex) { if (tx != null) tx.Koniec selectRecord").currentSession().closeSession(). new String(id)). System.println(". if (useTx) tx. } return obj. Session session = HibernateUtil. Transaction tx = null. obj = session. try { System.out.get(c. throw ex.Start selectRecord").println(". if (useTx) tx = session. String id. } .java public Object selectRecord(Class c.rollback().commit().out.

} System. } Query q = session. } catch (Exception ex) { if (tx != null) { tx. } } .println(".rollback().size="+list. if (useTx) { tx.commit(). } throw ex.Koniec selectRecords list.java public List selectRecords(String query. } finally { HibernateUtil.beginTransaction(). if (useTx) { tx = session.createQuery( query ).EventManager.list(). Transaction tx = null. list = q. try { Session session = HibernateUtil.out.currentSession().closeSession(). } return list.size()). String methodName = "selectRecords". boolean useTx) throws Exception { List list = new ArrayList().

java Mapowana klasa Zawierająca akcesory private Long id. .User. private String nazwisko. private String imie.

net/hibernate-mapping-3.User.lodz.xml – klasa mapowań <?xml version="1.sourceforge.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.dtd"> <hibernate-mapping> <class name="pl.p.0//EN" "http://hibernate.hbm.User" table="USER"> <id name="id" column="USER_ID"> <generator class="native"/> </id> <property name="imie"/> <property name="nazwisko"/> </class> </hibernate-mapping> .0.

0//EN" "http://hibernate.sourceforge.driver_class">org.xml"/> </session-factory> </hibernate-configuration> .username">sa</property> <property name="connection.NoCacheProvider</property> <property name="show_sql">true</property> <property name="hbm2ddl.net/hibernate-configuration-3.dialect.hsqldb.hbm.url">jdbc:hsqldb:hsql://localhost</property> <property name="connection.provider_class">org.hibernate.password"></property> <property name="connection.cfg.jdbcDriver</property> <property name="connection.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.hibernate.auto">create</property> <mapping resource="pl/lodz/p/User.HSQLDialect</property> <property name="current_session_context_class">thread</property> <property name="cache.hibernate.0.pool_size">10</property> <property name="dialect">org.use_reflection_optimizer">false</property> <property name="connection.bytecode.xml – plik konfiguracyjny <?xml version='1.cache.

Narzędzia wspomogające tworzenie aplikacji JSF Maven Eclipse JDeveloper .

Maven . Składa się z folderów ze źródłami.inteligentny system budowania aplikacji Budowa każdej aplikacji jest podobna. bibliotekami. Przy małych projektach struktura nie ma aż tak dużego znaczenia. Można go nazwać standardem. Maven jest kompleksowym narzędziem do budowania i zarządzania projektem. tu z pomocą przychodzi Maven. Instalacja Archiwum z Maven’em należy rozpakować Ustawić zmienną środowiskową PATH na katalog z bin’em Poprawność instalacji sprawdzić wywołują polecenie mvn --version . zasobami czy dokumentacją. Problem zaczyna się przy dużych aplikacjach.

lodz.pierwsza komenda mvn archetype:create DgroupId=pl.Maven .p .p DartifactId=example To polecenie spowoduje utworzenie projektu o nazwie example oraz pakietu pl.lodz.

lodz.xml.p Zostanie również utworzony plik pom. Będziemy do niego dodawać kolejne biblioteki.lodz.Maven – pierwsza komenda mvn archetype:create -DgroupId=pl.) Przy pierwszym uruchomieniu Maven sam ściągnie biblioteki . wykorzystywane w projekcie Wszystkie biblioteki będą przechowywane w repozytorium na dysku lokalnym w katalogu .p -DartifactId=example To polecenie spowoduje utworzenie projektu o nazwie example oraz pakietu pl.m2 (nie trzeba powielać ilości tych samych bibliotek w przypadku kilku projektów.

apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.Maven – pierwsza komenda <!– pom.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.1</version> <scope>test</scope> </dependency> </dependencies> </ project> .lodz.p</groupId> <artifactId>example</artifactId> <packaging>jar</packaging> <version>1.0</modelVersion> <groupId>pl.xml --> <project> <modelVersion>4.0.

zależnie od ustawienia w pom’ie mvn eclipse:eclipse utworzenie plików projektu pod środowisko eclipse . a w katalogu target otrzymamy pliki wynikowe mvn install zainstalowanie bibliotek mvn clean usunięcie plików źródłowych mvn package utworzenie wynikowego jar’a lub war’a.Maven – komendy mvn compile kompiluje program.

Czasami Maven nie będzie wstanie sam znaleźć biblioteki. Należy ją wtedy zainstalować ręcznie poleceniem: mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> .Maven komendy cd.

html .Maven .codehaus.codehaus.0_plugin_for_Eclipse.html Pokaz działania pluginu: http://m2eclipse.plugin Plugin np. pod eclipse spowoduje automatyczne dodanie do projektu wszystkich wymaganych bibliotek czy automatyczne package’owanie Pokaz instalacji pluginu: http://m2eclipse.org/Maven_2.org/Installing_Maven_2.0_Plugin_for_Eclipse.

xml Edycja nawigacji Edycja klasy ziarna Edycja pliku JSP .FacesIDE Edycja faces-config.

FacesIDE – Visual JSF Edycja JSP Nowy projekt Tworzenie klasy ziarna .

FacesIDE – Visual JSF Tworzenie komponentu Edycja komponentu .