background image

Definiowanie mapowań

Rafał Kasprzyk

background image

Rafał Kasprzyk

Przykład encji biznesowej

 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

 

}

  User.java

background image

Rafał Kasprzyk

Pliki mapowań

Definiowane w plikach *.hbm.xml, które 

można tworzyć ręcznie lub z 

wykorzystaniem generatorów

Inżynieria w przód

Generacja odwzorowania z POJO (np.XDoclet)

Inżynieria wstecz

Adaptacja istniejącego schematu bazy danych

Pliki opisujące odwzorowanie wskazywane 

są w pliku hibernate.cfg.xml

<hibernate-configuration>

<session-factory>

<--mapping files-->

<mapping resource="pl/isolution/hibernate/User.hbm.xml"/>

<mapping resource= …

</session-factory>

</hibernate-configuration>

hibernate.cf
g.xml

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

Więcej o definiowaniu 

odwzorowania

Odwzorowanie może być bardzo zwięzłe i proste

Większość atrybutów znaczników class i property ma 

sensowne wartości domyślne, odpowiednie w większości 

przypadków

Typy danych Hibernate

integer, long, short, float, double, character, 

byte, boolean (BIT), yes_no (CHAR(1): Y/N), 

true_false (CHAR(1): T/F)

Odwzorowanie typów prostych Javy na odpowiednie typy SQL 

(vendor-specific)

string

Odwzorowanie java.lang.String na VARCHAR (w Oracle 

VARCHAR2)

date, time, timestap

Odwzorowanie java.util.Date na DATE, TIME, TIMESTAMP

big_decimal, big_integer

Odwzorowanie java.lang.BigDecimal i 

java.lang.BigInteger na NUMERIC (w ORACLE na NUMBER)

calendar, calendar_date, locate, timezone, 

currency, class, binary, text, serializable, 

clob, blob

background image

Rafał Kasprzyk

Odwzorowanie identyfikatora

Odwzorowywane klasy trwałe 

muszą deklarować klucz główny 

tabeli

Deklaracja klucza głównego tabeli 

możliwa jest dzięki właściwości 

<id>

Hibernate pozwala na stosowanie 

złożonych kluczy głównych 

deklarowanych za pomocą 

właściwości <composite-id> (nie 

zalecane)

background image

Rafał Kasprzyk

Odwzorowanie identyfikatora

Definicja odwzorowania klucza 

zawiera element <generator class 

""> opisujący sposób generacji 

jego wartości

Atrybutu class może przyjąć 

następujące wartości: assigned, native, 

identity, sequence, select, increment, 

hilo, uuid.hex

background image

Rafał Kasprzyk

Generatory klucza głównego

assigned 

Wartość identyfikatora musi być nadana 

obiektowi przed próbą jego utrwalenia

native 

Generator automatycznie wybiera jeden z 

poniższych na podstawie możliwości bazy 

danych

identity 

Wsparcie dla automatycznie generowanych 

wartości kolumny w MySQL, DB2, Sybase, 

HypersonicSQL, MS SQL Server, Informix  

np. AUTO_INCREMENT w MySQL

sequence 

Oparty o sekwencję w bazie danych w DB2, 

PostgreSQL, Oracle, SAP DB, Interbase

background image

Rafał Kasprzyk

Generatory klucza głównego 

select 

Pobiera wartość ustawioną przez wyzwalacz w bazie 

danych

increment 

Działa na zasadzie inkrementacji maksymalnej 

wartości w kolumnie klucza głównego 

Generacja programowa działa jeżeli tylko jeden proces w 

danej chwili może wstawić wiersz do tabeli. Może więc być 

stosowany tylko wtedy gdy jedynie Hibernate ma dostęp do 

bazy danych. 

hilo 

Generator korzysta z algorytmu high/low do generacji 

wartości unikalnych w obrębie pojedynczej instancji 

bazy danych

uuid.hex 

Generator wykorzystuje algorytm bazujący na adresie 

IP komputera w kombinacji z czasem w chwili 

generacji. 

Uwaga!!! Zwraca wartość typu char.

background image

Rafał Kasprzyk

Przykład zmodyfikowanej encji 

biznesowej

package hibernate.example;

public class User {

private long id;

private String userName;

private PhoneNumber phone;

public long getId() {

  return id;

}

public void setId(long id) {

this.id = id;

}

... 

// pozostałe metody setXXX i getXXX

}

  User.java

background image

Rafał Kasprzyk

Kolejny przykład encji 

biznesowej

package hibernate.example;

public class PhoneNumber {

private String number;

private String areaCode;

private String countryCode;

public String getNumber() {

return number;

}

public void setNumber(String number){

this.number = number;

}

... 

// pozostałe metody setXXX i 

getXXX

}

PhoneNumb
er.java

background image

Rafał Kasprzyk

Struktura przykładowej tabeli

CREATE TABLE USER (

UID

BIGINT NOT NULL,

UNAME

VARCHAR(50),

PCOUNTRYCODE CHAR(2), 
PAREACODE

CHAR(3),

PNUMBER

VARCHAR(10),

PRIMARY KEY (ID)

)

background image

Rafał Kasprzyk

User.hbm.xml – przykład 

odwzorowania

<hibernate-mapping>

<class name=”hibernate.example” table=”User”>

    

    <id name=”id” column=”UID”>

<generator class=”increment”/>
    </id>
    <property name=”userName” column=”UNAME”/>

    

    <component name=”phone”>

<property name=”countryCode” 
column=”PCOUNTRYCODE” length=”2”/>
<property name=”areaCode” 
column=”PAREACODE” length=”3”/>
<property name=”number” 
column=”PNUMBER” length=”10”/>

    

    </component>

</class>

</hibernate-mapping>

background image

Rafał Kasprzyk

Generacja schematu bazy 

danych

 
 import org.hibernate.HibernateException;
 import org.hibernate.cfg.Configuration;
 ...
 Configuration cfg = new Configuration();

   // ładowanie hibernate.cfg.xml

 cfg.configure();
 ...

   // generowanie schematu bazy

 new SchemaUpdate(cfg).execute(true)

  // singleton, thread-safe

 SessionFactory sessionFactory =   

cfg.buildSessionFactory();

 Session session = 

sessionFactory.openSession();

background image

Rafał Kasprzyk

Generowanie kodu DDL

public void generateSchema(boolean exportToDB) 

throws HibernateException {
Configuration cfg = new Configuration()
.configure();
new SchemaExport(cfg)
.create(true, exportToDB);
}

Wynik zostanie wysłany na 

standardowe wyjście

Jeśli parametr exportToDB jest 

ustawiony na true to wygenerowany 

kod DDL zostanie uruchomiony w celu 

utworzenia schematu bazy danych

background image

Rafał Kasprzyk

Podsumowanie

Encja biznesowa

Pliki mapowań – definiowanie 

odwzorowania

Typy danych Hibernate

Odwzorowanie identyfikatora

Generatory klucza głównego

Generacja kodu DDL i schematu 

bazy danych


Document Outline