background image

Tworzenie warstwy 

trwałości danych w 

oparciu o Hibernate

Rafał Kasprzyk

background image

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

background image

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() {
        //…

    }

background image

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;

background image

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

}

background image

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> 

background image

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> 

background image

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

background image

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

background image

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

}

background image

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> 

background image

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> 

background image

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) {
//…
}

background image

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);
}

background image

Rafał Kasprzyk

Podsumowanie

Algorytm budowy aplikacji

Przygotować klasy trwałe

Przygotować metadane (pliki 

mapowań)

Utrwalanie obiektów

Ładowanie utrwalonych obiektów


Document Outline