Hibernate mapowanie baz danych

Hibernate – mapowanie baz danych Jest to technologia pozwalająca mapować dane obiektowe na odpowiadające im struktury w bazach danych. ORM - Object-to...
16 downloads 6 Views 1MB Size
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.

konfiguracja Ważne pojęcia: Configuration.configure() – pierwszy krok, konfiguracyjnego (plik pobierany z zasobów)

odnalezienie

pliku

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() Session – sesja, pewna jednostka pracy Transaction – jeszcze mniejsza jednostka pracy (musi być zainicjalizowana sesja)

hibernate.cfg.xml org.hsqldb.jdbcDriver jdbc:hsqldb:data/tutorial sa org.hibernate.dialect.HSQLDialect true

hibernate.cfg.xml cd. 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

Mapowanie (*hbm.xml) Mapowanie polega na odwzorowaniu obiektu na dany rekord w bazie.

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.

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

Przykład 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(); }

przykład cd. 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(); } }

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

Przykład:

SELECT AVG(us.wiek), SUM(us.wiek), MAX(us.wiek), COUNT(us) FROM User AS us WHERE us.imie=‘Jan'

Hibernate – Criteria cd. Criteria pozwalają w prosty oraz intuicyjny sposób ograniczyć liczbę zwracanych rekordów. Nie potrzeba znać dokładnie struktury języka zapytań. Wynik zapytania jest zwrócony w postaci listy. Aby ją utworzyć należy w odpowiedniej metodzie podać nazwę klasy (np. User)

Criteria crit = sess.createCriteria(User.class); crit.setMaxResults(50); List users = crit.list(); List users = sess.createCriteria(User.class) .add( Restrictions.like(„nazwisko", „Now%") ) .add( Restrictions.between(„wiek", minWiek, maxWiek) ).list();

Hibernate - SQL 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();

Hibernate – prosty przykład Niezbędne biblioteki Hibernate: antlr-2.7.6rc1.jar cglib-2.1.3.jar commons-collections-2.1.1.jar commons-logging-1.0.4.jar dom4j-1.6.1.jar ehcache-1.1.jar hibernate3.jar hsqldb.jar jta.jar c3p0-0.9.0.jar

Hibernate – prosty przykład Będziemy korzystać z bazy HSQL DB W projekcie należy utworzyć folder data (np. na wysokości pakietu) i otworzyć w nim linię poleceń Bazę uruchamiamy za pomoca komendy java -classpath lib/hsqldb.jar org.hsqldb.Server Należy pamiętać o zakomentowaniu następującego hibernate.cfg.xml po pierwszym uruchomieniu aplikacji

wpisu

create Przy zmianie struktury bazy należy go z powrotem odkomentować Na koniec należy zrestartować bazę.

w

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

Hibernate – prosty przykład cd. HibernateUtil.java

public static Session currentSession() throws HibernateException { Session s = (Session)SESSION.get(); if (s == null) { s = SESSION_FACTORY.openSession(); SESSION.set(s); } return s; } public static void closeSession() throws HibernateException { Session s = (Session)SESSION.get(); SESSION.set(null); if (s != null) s.close(); } }

EventManager.java Plik do połączeń z bazą danych Znajdują się tam wszystkie niezbędne metody

package pl.lodz.p; import java.io.Serializable; import java.util.*; import org.hibernate.*; import pl.lodz.p.User; public class EventManager {

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

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

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

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

User.hbm.xml – klasa mapowań

hibernate.cfg.xml – plik konfiguracyjny false org.hsqldb.jdbcDriver jdbc:hsqldb:hsql://localhost sa 10 org.hibernate.dialect.HSQLDialect thread org.hibernate.cache.NoCacheProvider true create

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

Maven - inteligentny system budowania aplikacji Budowa każdej aplikacji jest podobna. Składa się z folderów ze źródłami, bibliotekami, zasobami czy dokumentacją. Przy małych projektach struktura nie ma aż tak dużego znaczenia. Problem zaczyna się przy dużych aplikacjach, tu z pomocą przychodzi Maven.

Maven jest kompleksowym narzędziem do budowania i zarządzania projektem. Można go nazwać standardem. 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

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

Maven – pierwsza komenda

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

Maven – pierwsza komenda 4.0.0 pl.lodz.p example jar 1.0-SNAPSHOT Maven Quick Start Archetype http://maven.apache.org junit junit 3.8.1 test

Maven – komendy mvn compile kompiluje program, 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, zależnie od ustawienia w pom’ie mvn eclipse:eclipse utworzenie plików projektu pod środowisko eclipse

Maven komendy cd. Czasami Maven nie będzie wstanie sam znaleźć biblioteki. Należy ją wtedy zainstalować ręcznie poleceniem:

mvn install:install-file -Dfile= -DgroupId= -DartifactId= -Dversion= -Dpackaging=

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

FacesIDE Edycja faces-config.xml

Edycja nawigacji

Edycja klasy ziarna

Edycja pliku JSP

FacesIDE – Visual JSF

Edycja JSP Nowy projekt

Tworzenie klasy ziarna

FacesIDE – Visual JSF Tworzenie komponentu

Edycja komponentu

Suggest Documents