Java 8

advertisement
Zakład Inżynierii Oprogramowania
Programowanie w języku Java
WYKŁAD
dr inż. Piotr Zabawa
Certyfikowany Konsultant IBM/Rational
e-mail: [email protected]
www:
http://www.pk.edu.pl/~pzabawa
28.04.2014
Zakład Inżynierii Oprogramowania
WYKŁAD 9
Trwałość w Java – cz. 2
wykład o Hibernate został w znacznej części
oparty o materiały nieznanego autora
http://www.icis.pcz.pl/~draco/Hibernate.pdf
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Trwałość w Java
Czym kierować się przy wyborze podejścia do trwałości?
dr inż..Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Trwałość w Java
Argumenty za ORM
•
•
•
•
•
•
•
•
•
Eliminuje ręczne mapowanie w Java z SQL ResultSet do klas Java.
Redukuje ilość pracy wymaganej do obsługi zmiany modelu danych w relacyjnej bazie
danych lub po stronie obiektowej w apliakcji.
Maksymalizuje wykorzystanie dużej biblioteki trwałości pozwalając na uniknięcie
rozwijania rozwiązań problemów już rozwiązanych przez innych.
Eliminuje niskopoziomowy kod JDBC i SQL.
Maksymalizuje możliwość wykorzystania programowania obiektowego i modelu
obiektowego.
Wprowadza niezależność pomiędzy bazą danych i jej strukturą (?) Provides database
and schema independence.
Większość produktów ORM jest darmowa i open source’owa.
Wiele korporacji dostarcza wsparcia i usług dla produktów ORM.
Dostarcza wysoko wydajnościowych cech, jak cache’owanie oraz wyrafinowana
optymalizacja operacji na bazie danych.
dr inż..Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Trwałość w Java
Argumenty za JPA
• Jest stadardem i częścią EJB3 oraz Java EE.
• Wiele darmowych i open source’owych produktów ze wsparciem
biznesowym.
• Przenośność pomiędzy serwerami aplikacyjnymi i produktami
trwałościowymi (uniknięcie zależności od dostawcy).
• Użyteczna i funkcjonalna specyfikacja.
• Wparcie zarówno dla Java EE jak i dla Java SE.
dr inż..Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Trwałość
•
•
•
•
Uwzględnić mapowania:
ORM (JPA, Hibernate)
GRM
XML
projekt Spring Data
Kwestia obiektowych baz danych.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Trwałość
•
•
•
•
•
Uwzględnić architektoniczne wzorce korporacyjne:
DAO (Data Access Object)
DTO (Data Transfer Object)
ActiveRecord
Broker
SDO = JDO + DTO (Service Data Object= Java Data Object+ Data
Transfer Object)
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Trwałość w Java
Java 8
JDBC a Java 8
http://java.dzone.com/articles/adding-java-8-lambda-goodness
Nawiązać do kwestii obsługi wyjątków w Java 8 w kontekście JDBC
http://openjdk.java.net/projects/jdk8/features
http://blog.jooq.org/tag/java-8/
http://www.oracle.com/technetwork/java/javase/tech/index-jsp136101.html
dr inż..Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Trwałość w Java
Natura problemów z dopasowaniem relacyjnych baz danych do
paradygmatu obiektowego:
• Celem optymalizacji relacyjnych baz danych (normalizacja) jest
oszczędność zasobów poprzez unikanie redundancji
• Celem optymalizacji kodu obiektowego jest czytelność i łatwość
wprowadzania zmian
Dlatego zestawienie tych dwóch światów jest trudne – jest konflikt
interesów.
dr inż..Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Trwałość w Java
Charakter niedopasowania:
• Granulacja – inna ilość klas niż tabel
• Dziedziczenie – nie wspierane bezpośrednio w RDB
• Asocjacje – jednokierunkowe w Java, klucze obce w RDB
• Krotność asocjacji – nie jest specyfikowana wprost w Java, wspierana
przez klucze obce w RDB
• Nawigowanie po danych – przechodzenie po obiektach w Java,
łączenie tabel (join) w RDB
dr inż..Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
JPA stanowi specyfikację mapowania obiektowo-relacyjnego i
trwałości dedykowaną dla języka programowania Java.
JPA 2.1 jest standardem opracowanym przez twórców języka Java w
ramach inicjatywy standaryzacyjnej Java Community Process o
identyfikatorze JSR 338.
Wersja ta jest najnowszą, zatwierdzoną w 2013 roku, wersją standardu
JPA obecnie wspieraną jedynie przez następujące produkty:
• Hibernate
• EclipseLink
• Data Nucleus
JPA wraz z produktami stanowiącymi implementację tego standardu są
łącznie nazywane ORM (Object-Relational Mapping).
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
ORM jest obecnie najbardziej dojrzałą koncepcją wiązania danych z
relacyjnej bazy danych z obiektami w paradygmacie klasowoobiektowym. Dlatego podejście to oraz jego implementacja zostały
przedstawione w ramach wykładu z Java SE. Zwykle ORM prezentuje się
w ramach wykładów dopiero w kontekście Java EE, co wymaga
uprzedniego zaznajomienia się z rozbudowanym systemem pojęć
typowym dla Java EE. Jest to jednak całkowicie zbyteczne i stanowi
zbędny balast dla osób pragnących poznać jedynie kwestię ORM.
W ramach ORM wykorzystuje się adnotacje w celu powiązania klas z
tabelami.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
Potencjalne korzyści ze stosowania JPA:
• Mniej kodu
• Spójny model interakcji z bazą danych
• Wydajność
• Niezależność od wersji i od dostawcy serwera bazy danych (pod
warunkiem nie korzystania ze specyfiki)
• Uniknięcie znajomości SQL
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1 - wady
•
•
Złożoność
– Trudniejsze do nauki
– Trudniejsze do debugowania
– Częstsza degradacja wydajnościowa
Ograniczona elastyczność
– Trudniejsze uwzględnianie specyfiki serwerów bazodanowych
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
Przykład:
@Entity
@Table(name="USER")
public class User {
@Id
@SequenceGenerator(name="UserSequence", sequenceName="USER_PK",
allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator="UserSequence")
private Long id;
@Column(name="USERNAME", nullable=false)
private String name;
@Column(name="FULL_NAME")
private String fullName;
}
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
Podstawowy interfejs przy pracy z JPA, to EntityManager:
EntityManager entityManager =
entityManagerFactory.createEntityManager();
Example example = entityManager.find(Example.class, 1L);
entityManager.close();
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
•
•
•
•
Adnotacje dotyczące relacji:
@OneToOne
@OneToMany
@ManyToOne
@ManyToMany
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
Przykład:
@Entity @Table(name="ORDER")
public class Order {
@ManyToOne
@JoinColumn(name=”CUSTOMER_ID”, referencedColumnName=”ID”)
private Customer customer;
}
@Entity @Table(name="CUSTOMER")
public class Customer {
@OneToMany(mappedBy=”customer”)
private Set<Order> orders;
}
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
Gdy JPA ładuje (fetch) encję z bazy musi wiedzieć czy załadować
również encje powiązane z nią relacjami.
• Eager: pobranie powiązanych encji od razu, domyślne dla relacji
@OneToOne i @ManyToOne
• Lazy: pobranie powiązanych encji w chwili sięgnięcia do nich w
kodzie źródłowy, domyślne dla relacji @OneToMany i
@ManyToMany
@OneToMany(mappedBy=”customer”, fetch=FetchType.EAGER)
private Set<Order> orders;
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
JPA 2.1
Uprzednie zamknięcie obiektu EtityManager przed odwołaniem do
powiązanych encji prowadzi do błędu Lazy Initialization Error.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Hibernate stanowi jedną z kilku implementacji standardu JPA 2.1.
Jako produkt tworzony i udostępniany jest przez organizację JBoss,
która należy do firmy RedHat:
http://hibernate.org/orm/
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Ze względu na fakt przedstawienia w ramach zajęć laboratoryjnych
narzędzia Maven podano poniżej sposób wykorzystania Hibernate z
poziomu Maven’a.
Repozytoria Mavena – proszę sprawdzić sposób nawigowania po
nich!
• JBoss Nexus (producenta, więc pierwsze):
https://repository.jboss.org/nexus/content/groups/public/org/hibernate
• Maven Central (z niewielkim, kilkudniowym opóźnieniem):
http://repo1.maven.org/maven2/org/hibernate/hibernate-core
http://mvnrepository.com/artifact/org.hibernate
• SourceForge:
https://sourceforge.net/projects/hibernate/files/hibernate4
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Zależność Hibernate jako produktu dla Mavena (od aktualnej
wersji):
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.5.Final</version>
</dependency>
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Zależność implementacji JPA jako części Hibernate dla Mavena
(od aktualnej wersji):
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.5.Final</version>
</dependency>
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
W czasie używania nowych technologii należy mieć na względzie
następujące okoliczności powodujące, że nie należy używać w projektach
nie służących jedynie samokształceniu wersji najnowszych
oprogramowania:
• Brak wsparcia przez IDE (przykładem jest brak należytego wsparcia w nowej
technologii Java 8 w dostępnych obecnie środowiskach Eclipse)
• Brak dokumentacji dla produktów open-source (czasmi i niektórych) – warto
korzystać z dokumentacji do tego produktu, którego się używa w projekcie
• Zbyt nowe IDE – brak wsparcia dla wielu innych technologii
• Brak wsparcia ze strony społeczności – zbyt mało wykrytych i rozwiązanych
problemów, których wielość jest typowa dla nowych technologii
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Hiernate jest jednym z najlepiej ocenianych frameworków do realizacji
warstwy dostępu do danych (ang. persistance layer = warstwa trwałości).
Zapewnia on przede wszystkim odwzorowanie/translację (ang. O/R
mapping) danych pomiędzy relacyjną bazą danych a światem
obiektowym.
Opiera się na wykorzystaniu opisu struktury danych za pomocą języka
XML, dzięki czemu można "rzutować" obiekty, stosowane w
obiektowych językach programowania, takich jak Java bezpośrednio na
istniejące tabele bazy danych.
Zawiera też mechanizm pozwalający na inżynierię w przód (ang.
forward engineering) struktury bazy danych (tabel i relacji) na podstawie
klas oraz inżynierię wsteczną (ang. reverse engineering) polegającą na
generowaniu kodu źródłowego klas z bazy danych o określonej strukturze.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Dodatkowo Hibernate zwiększa wydajność operacji na bazie danych
dzięki buforowaniu i minimalizacji ilości przesyłanych zapytań (por. z
trybem pracy wsadowej JDBC). Jest to projekt rozwijany jako open
source.
Według dokumentacji celem Hibernate jest zwolnienie projektanta
aplikacji z konieczności ręcznego kodowania 95% zadań związanych z
zapewnieniem trwałości danych. Jedną z istotnych zalet tego rozwiązania
jest zwolnienie programisty z konieczności przepisywania
poszczególnych pól obiektów na pola rekordu i na odwrót.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Struktura biblioteki:
• Hibernate Core - podstawowa część biblioteki, wykonująca większość pracy,
• Hibernate Annotations - element pozwalający zastąpić większą część
konfiguracji Hibernate, budowanej do tej pory w XML, poprzez adnotacje w
kodzie napisane z użyciem Javy 5.
• Hibernate Tools – które zawierają rozmaite wtyczki (plug-ins) dla Anta oraz
darmowego środowiska Eclipse IDE. Wtyczka Hibernate Tools dla Eclipse
oferuje:
– Edytor odwzorowań (uzupełnianie i kolorowanie kodu)
– Konsolę Hibernate (przegląd konfiguracji, klas, itp. oraz interaktywne
zapytania HQL
– Kreatory i generatory kodu (w tym kompletny reverse-engineering
istniejącego schematu bazy danych)
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Architektura ogólna Hibernate:
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Architektura szczegółowa Hibernate została przedstawiona na
następnym slajdzie
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
•
•
Plik konfiguracyjny Hibernate może mieć jedną z dwóch postaci:
Plik properties o nazwie hibernate.properties (mniej wygodne)
Plik XML o nazwie hibernate.cfg.xml
W czasie obsługi trwałości za pomocą mapowania obiektoworelacyjnego Hibernate wykorzystuje te informacje.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – interfejsy
Interfejsy podstawowe
• Interfejs Session – główny interfejs wykorzystywany w każdej aplikacji. Jest
to lekki obiekt, często tworzony i zwalniany. Stanowi formę pośrednią pomiędzy
połączeniem i transakcją. Nazywa się go czasem zarządcą trwałości.
• Interfejs SessionFactory – po jednej instacji obiektu dla każdej bazy danych.
Służy do tworzenia obiektów klasy Session.
• Interfejs Configuration – służy do konfiguracji i uruchamiania Hibernate.
• Interfejs Transaction – pozwala na wykorzystywanie mechanizmu transakcji i
jego użycie jest opcjonalne.
• Interfejsy Query i Criteria – służą do wysyłania zapytań i sterowania procesem
ich wykonania. Można wykorzystać język HQL (Hibernate Query Language) lub
natywny dla bazy danych SQL.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – interfejsy
Interfejsy wywołań zwrotnych (ang. callback)
Opcjonalne interfejsy umożliwiające aplikacji otrzymywanie
powiadomień o zmianie stanu obiektu. Przykładem zastosowań są
operacje audytowe (zapisywanie w bazie danych informacji o
aktywnościach systemu softwerowego).
• Interfejsy Lifecycle i Validator – rekacja obiektó trwałych na operacje
CRUD
• Interfejs Interceptor – oparty o koncepcję odwróconego sterowania
(inversion of control) interfejs pozwalający uniknąć w obsłudze wywołań
zwrotnych konieczności implementowania interfejsów Hibernate po
stronie aplikacji
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – stany obiektów
Z perspektywy Hibernate można wyróżnić następujące trzy stany:
• Transient (ulotny) – są to obiekty klas aplikacji nie odwzorowywanych w bazę danych, czyli
takie, które nie są trwałe
• Persistent (trwały) – są to trwałe obiekty klas encyjnych. Obiekt staje się trwały po
wywołaniu na nim operacji save() z interfejsu Session – następuje wtedy powiązanie go z
określoną sesją. Egzemplarz obiektu trwałego może też powstać na podstawie informacji z bazy
danych uzyskanych w wyniku wykonania zapytania, wyszukania identyfikatora lub przejścia do
niego przez graf obiektów z innego obiektu.Obiekt trwały może stać się ulotnym po wykonaniu na
nim operacji delete() z interfejsu Session – wtedy wiersz reprezentujący go zostaje usunięty z tabeli
a obiekt – odłączony od sesji.
• Detached (odłączony) – obiekt przechodzi w ten stan po zamknięciu jego sesji za pomocą
operacji close() obiektu Session. Możliwość ponownego podłączenia do sesji obiektó uzyskanych
uprzednio z innej sesji w znaczącym stopniu wpływa na sposób projektowania aplikacji
wielowarstwowych. Możliwość zwrócenia obiektów z jednej transakcji do warstwy wyższej (np.
warstwy prezentacji) i ponowne użycie ich w innej transakcji stanowi jeden z głównych powodów
popularności Hibernate. Wszystkie obiekty pobrane w trakcie trwania transakcji są niejawnie
odłączane w momencie zamykania sesji lub w momencie ich serializacji (na przykład w celu
przesłania do innego komputera).
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate - scenariusze
Przykładowy scenariusz uczynienia obiektu trwałym (zapis):
SessionFactory sf = new
Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
Osoba o= new Osoba();
o.setImie("Zbigniew");
o.setNazwisko("Boniek");
s.save(o);
tx.commit(); // możliwe jest wycofanie transakcji:
tx.rollback())
s.close();
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate - scenariusze
Przykładowy scenariusz pobrania obiektu z bazy (odczyt):
//Wyjątek gdy błędny klucz:
Osoba o = (Osoba) s.load(Osoba.class, new Long(20));
System.out.println(o.getImie());
albo:
// Zwraca null gdy błędny klucz
Osoba o = (Osoba) s.get(Osoba.class, new Long(20));
System.out.println(o.getImie());
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate - scenariusze
Przykładowy scenariusz usunięcia obiektu z bazy (zapis):
// obiekt stanie się ulotny,ale referencja może zostać:
s.delete(o);
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate - scenariusze
Przykładowy scenariusz modyfikacji obiektu trwałego (zapis):
o.setNazwisko("Smolarek");
// jeśli zmiany mają natychmiast zostać zapisane w bazie:
s.flush();
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Reguły POJO (najdogodniejsze) dla Hibernate są następujące:
• Metody set/get (accessor/mutator)(Metody dostępowe) dla trwałych atrybutów
klasy pól w tabeli, dzięki którym mamy dostęp do prywatnych pól klasy
• Bezargumentowy konstruktor (może być domyślny)-jest wymagany przez
Hibernate do tego, aby klasa mogła być utrwalana w bazie.
• Identyfikator (opcjonalnie)
• Oprócz domyślnego konstruktora dla każdej klasy, możemy dostarczyć także
konstruktor umożliwiający bezpośrednie przypisanie pól innych niż klucze
podstawowe. Dzięki temu możemy stworzyć i wypełnić obiekt w jednej czynności
zamiast kilku.
• Klasa nie może być zadeklarowana jako final
• Może być final, ale w pewnych przypadkach może to np. ograniczać możliwości
strojenia wydajności
• Hibernate może wewnętrznie zarządzać identyfikatorami obiektu (ale jest to
niezalecane)
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – prosty przykład
Klasa POJO bez adnotacji:
public class Osoba {
private Long id;
private String imie;
private String nazwisko;
public Osoba() {}
public void setId(Long id) {
this.id = id;
}
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – prosty przykład
public Long getld() {
return id;
}
public void setImie(String imie) {
this.imie = imie;
}
public String getImie() {
return imie;
}
public void setNazwisko(String nazwisko) {
this. nazwisko = nazwisko;
}
public String getNazwisko () {
return nazwisko;
}
}
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – prosty przykład
Klasa POJO z adnotacjami:
@Entity
@Table(name = "Osoba")
public class Osoba {
@Id @GeneratedValue
@Column(name = "Num_osob") private Long id;
@Column(name = "Imie") private String imie;
@Column(name = "Nazwisko") private String nazwisko;
}
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – zapytania HQL
Zapytania w języku HQL – jest to język zorientowany obiektowo o
składni podobnej do SQL odwołujący się do klas a nie do tabel.
•
wykonanie zapytań poprzez list() - zwraca cały wynik zapytania do kolekcji w
pamięci (instancje pozostają w stanie trwałym):
List osoby= (List) session.createQuery("from Osoba as osoba
where osoba.imie= 'Zbigniew'").list();
for (int i=0; i<osoby.size(); i++)
System.out.println(((Osoba)osoby.get(i)).getImie());
List osoby = (List)s.createQuery("select Osoba.id, Osoba.imie
from Osoba as osoba where Osoba.nazwisko = 'Boniek'").list();
for (int i=0; i<osoby.size(); i++) {
Object [ ] tab = (Object [ ]) osoby.get(i);
System.out.println(tab[0]+" "+tab[1]);
}
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – zapytania
•
wykonywanie zapytań poprzez iterate() - zwraca wynik w kilku zapytaniach
SELECT: może być efektywniejsze od list(), gdy instancje już są w pamięci
podręcznej, ale rozwiązanie to jest zazwyczaj wolniejsze.
Iterator osoby = s.createQuery("from Osoba as osoba
where osoba.nazwisko = 'Boniek'").iterate();
while (osoby.hasNext()) {
Osoba o = (Osoba) osoby.next();
System.out.println(o.getImie());
}
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – zapytania
•
Pobieranie obiektów z bazy danych – w przypadku zapytań join zawierających
odniesienia do tabel połączonych relacjami:
– @OneToMany i @ManyToMany – następuje leniwe pobieranie (ang. lazy
fetching) rekordów z bazy w czasie pierwszego odwołania do nich
– @OnetoOne oraz @ManytoOne – następuje natychmiastowe pobieranie
(ang. Eager fetching) rekordów z bazy
Oba powyższe zachowania są domyślne.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – zapytania SQL
•
Zapytania w natywnym języku SQL – dają możliwość wykorzystania
specyficznych dla danego systemu konstrukcji składniowych np.
CONNECT w Oracle.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – zapytania Criteria
•
Zapytania poprzez obiekty klasy Criteria – umożliwiają budowę
zapytań poprzez obiektowe API
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – zapytania Example
•
Zapytania poprzez obiekty klasy Example – umożliwiają
wyszukiwanie danych w oparciu o przykadową instancję (mechanizm
QBE – QueryByExample)
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – dobre praktyki
Źródło: http://blog.castsoftware.com/using-hibernate-frameworks-what-arethe-best-practices/
• Tworzyć wiele małych klas i odwzorowywać je (ang. map) w <component>
• Dla klas trwałych deklarować własności (ang. properties ) identyfikatora
• Identyfikować naturalne klucze
• Umieszczać każde odwzorowanie klasy w jej własnym pliku
• Ładować odwzorowania jako zasoby
• Rozważać eksternalizowanie stringów zapytań
• Nie zarządzać własnymi połączeniami JDBC
• Rozważać używanie własnych typów
• Używać ręcznie zakodowanych odwołań do JDBC w wąskich gardłach
aplikacji
• Rozumieć flushing obiektów klasy Session
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate – dobre praktyki
• Rozważyć używanie obiektów odłączonych w aplikacjach 3-warstwowych
• Rozważyć używanie długich kontekstów trwałości w aplikacjach 2warstwowych
• Nie traktować wyjątków jako recoverable
• Preferować lazy fetching dla asocjacji
• W ramach MVC używać otwartych sesji albo disciplined assembly phase aby
uniknąć problemów z unfetched data
• Rozważyć uniezależnienie logiki biznesowej od Hibernate
• Nie używać egzotycznych odwzorowań asocjacji
• Preferować asocjacje dwukierunkowe
UWAGA: wielość dobrych praktyk wynika z braku określenia kryterium
jakości – nie wiemy co kto optymalizuje ani jak zmierzyć jakość zestawu praktyk!
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Przykład wykorzystania Hibernate w aplikacji Java SE – p. Klęk.
W tym przykładowy plik pom
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Uruchamianie aplikacji z Hibernate - możliwości:
• Uzyskanie połączenia z istniejącą bazą danych przy starcie lub w
trakcie działania
• Utworzenie bazy danych przy starcie aplikacji – kwestia zainicjowania
jej danymi
• Możliwość wykorzystania języka DDL do utworzenia bazy danych
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
Praca z Hibernate w środowisku IDE na przykładzie Eclipse’a.
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Hibernate
•
Materiały dodatkowe
O wydajności JPA
http://www.bottega.com.pl/pdf/materialy/JPA-wydajnosc.pdf
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Koniec
dr inż. Piotr Zabawa
Instytut Informatyki
Wydział Fizyki, Matematyki i Informatyki
Download