Definiowanie mapowań
Rafał Kasprzyk
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
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
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
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
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)
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
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
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.
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
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
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)
)
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>
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();
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
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