Tworzenie warstwy
trwałości danych w
oparciu o Hibernate
Rafał Kasprzyk
Rafał Kasprzyk
Pierwszy przykład
Naukę Hibernate rozpoczniemy od prostego
przykładu – katalog użytkowników
użytkownik to nasza encja
Informacje opisujące użytkownika, które będą nas
interesowały, to jedynie jego identyfikator, imię i
nazwisko
package pl.isolution.hibernate;
public class User {
private Long id;
private String name;
private String surname;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
…
// pozostałe metody setXXX i getXXX
}
Rafał Kasprzyk
Klasa korzystająca z API
Hibernate
package pl.isolution.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class HibSample {
private final static SessionFactory factory;
static {
// I. Inicjalizacja Hibernate
Configuration cfg = new Configuration().configure();
// II. Utworzenie fabryki sesji Hibernate
factory = cfg.buildSessionFactory();
}
public static void main(String[] args) {
HibSample hs = new HibSample();
hs.createUser();
hs.displayUsers();
}
public Long createUser() {
//…
}
public void displayUsers() {
//…
}
}
Rafał Kasprzyk
Tworzenie nowych użytkowników
public Long createUser() {
// III. Otwarcie sesji Hibernate
Session session = factory.openSession();
// IV. Rozpoczęcie transakcji
Transaction transaction = session.beginTransaction();
// V a. Utworzenie użytkownika
User user = new User();
user.setName("Jan");
user.setSurname("Kowalski");
// VI a. Zapisanie użytkownika w bazie danych
Long id = (Long)session.save(user);
// VII a. Zatwierdzenie transakcji
transaction.commit();
// VIII a. Zamknięcie sesji Hibernate
session.close();
return id;
}
Rafał Kasprzyk
Wyświetlanie użytkowników
public void displayUsers() {
// III. Otwarcie sesji Hibernate
Session session = factory.openSession();
// IV. Rozpoczęcie transakcji
Transaction transaction =
session.beginTransaction();
// V b. Utworzenie zapytania do bazy o listę
użytkowników
Criteria criteria =
session.createCriteria(User.class);
// VI b. Wykonanie zapytania
List users = criteria.list();
// VII b. Iterowanie po wyniku zapytania
for (Iterator it = users.iterator(); it.hasNext();){
User user = (User) it.next();
System.out.println(user.getSurname());
}
// VIII b. Zatwierdzenie transakcji
transaction.commit();
// IX b. Zamknięcie sesji Hibernate
session.close();
}
Rafał Kasprzyk
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-
3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">
org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:.</property>
<property name="connection.username">admin</property>
<property name="connection.password">isol</property>
<property name="connection.pool_size">1</property>
<property name="dialect">
org.hibernate.dialect.HSQLDialect</property>
<property
name="current_session_context_class">thread</property>
<property name="cache.provider_class">
org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="pl/isolution/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Rafał Kasprzyk
User.hbm.xml – przykład
odwzorowania
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="pl.isolution.hibernate">
//odwzorowanie klasy na tabelę
<class name="User" table="User">
<id name="id">
<generator class="native"/>
//definicja generatora
</id>
//nazwa kolumny w bazie danych domyślnie = wartość atrybutu
name
<property name="name" column="NAME"
//domyślna wartość atrybutu type najczęściej OK
type="string" length="10"
//wartość atrybutu not-null domyślnie = false
not-null="true"
// domyślnie true, dla pól wyliczeniowych należy ustawić na
false
update= "true" insert= "true" />
<property name="surname" column="SURNAME"
length="25" not-null="true"/>
</class>
</hibernate-mapping>
Rafał Kasprzyk
Uruchomienie aplikacji
Uruchomienie aplikacji sprowadza
się do wykonania polecenia
java pl.isolution.hibernate.HibSample
Aplikacja wymaga biblioteki
hsqldb.jar
W ten sposób stworzona została
pierwsza aplikacja, która jako
warstwę integracji wykorzystuje
bibliotekę Hibernate
Rafał Kasprzyk
Kolejny przykład
Jeszcze jeden prosty przykład zanim
przejdziemy do bardziej
zaawansowanych sposobów
wykorzystania biblioteki Hibernate
Pamiętajmy, że ”trening czyni mistrza”
Podstawowe elementy aplikacji
encje – klasy trwałe
pliki mapowań
pliki konfiguracyjne
Rafał Kasprzyk
Podstawowe elementy aplikacji
(1/3)
Klasy reprezentujące encje
Posiadają metody typu setXXX i getXXX dla
atrybutów, które będą utrwalane
Posiadają bezargumentowe konstruktory
package pl.isolution.hibernate;
public class OrganizationUnit {
private int id;
private String symbol
private Date date
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
…
// pozostałe metody setXXX i getXXX
}
Rafał Kasprzyk
Podstawowe elementy aplikacji
(2/3)
Pliki mapowań
(OrganizationUnit.hbm.xml)
<?xml …?>
<!DOCTYPE …>
<hibernate-mapping package="pl.isolution.hibernate" >
<class name="OrganizationUnit"
table="OrganizationUnit">
<id name="id" column="ID">
<generator class="increment"/>
</id>
<property name="date" column="DATE"
type="timestamp" />
<property name="symbol"/>
</class>
</hibernate-mapping>
Rafał Kasprzyk
Podstawowe elementy aplikacji
(3/3)
Pliki konfiguracyjny
hibernate.properties
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">
org.hsqldb.jdbcDriver</property>
<property name="connection.url">
jdbc:hsqldb:data/sample</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="OrganizationUnit.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Rafał Kasprzyk
Przykładowy kod wykonywalny
public class HibSample {
private final static
SessionFactory sessionFactory =
new Configuration()
.configure()
.buildSessionFactory();
private final static
ThreadLocal threadLocal = new ThreadLocal();
public static void main(String[] args) {
HibSample hs = new HibSample();
hs.createUnit(
"
U01
"
, new Date());
}
public void createUnit(Strind str, Date date) {
//…
}
}
Rafał Kasprzyk
Przykładowy kod wykonywalny
public void createUnit(Strind str, Date date) {
Session session =
(Session) threadLocal.get();
if( session == null) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
Transaction transaction =
session.beginTransaction();
OrganizationUnit unit = new OrganizationUnit();
unit.setSymbol(str);
unit.setDate(date);
session.save(unit);
transaction.commit();
session.close();
threadLocal.set(null);
}
Rafał Kasprzyk
Podsumowanie
Algorytm budowy aplikacji
Przygotować klasy trwałe
Przygotować metadane (pliki
mapowań)
Utrwalanie obiektów
Ładowanie utrwalonych obiektów