You are on page 1of 47

2012. mrcius 19.

Objektumorientlt szoftvertervezs
3. Perzisztencia

BME IIT, Lszl Zoltn, 2012

Bevezets

Perzisztencia:
kitarts,

llhatatossg, szvssg

Persistence
,

th characteristic the h t i ti of f data d t that th t outlives tli the th execution ti of the program that created it. Without this capability, data only exists in memory, and will be lost when the memory loses power. (wikipedia) is the ability of the programmer to have her/his data survive the execution of a process, in order to eventually reuse it in another process.
(OODB System Manifesto, Univ. Leeds)
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 2

Bevezets

Objektumok
Viselkeds Szerkezet llapot Egyedisg

lettartam
Automatikus

vltozk: blokk objektum Osztlyvltozk: program futsa


Attribtumok:
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 3

BME IIT, Lszl Zoltn

2012. mrcius 19.

Bevezets

Hogyan lhetjk tl a restartot ?


Mi

az, hogy tllni ? s struktra ? llapot visszalltsa Mi van a referencikkal ?


Viselkeds

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Bevezets

Hogyan lhetjk tl a restartot ? Megoldsok


Szerializls,

fjlkezels

Egyszer, gyors, nincs query

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Bevezets
Hogyan lhetjk tl a restartot ? Megoldsok

Relcis

adatbzis

gyors, query, transzformci t f i "Using tables to store objects is like driving home and then disassembling the car to put in the garage. It can be assembled again in the morning, but one eventually asks whether this is the most efficient way to park a car." Esther Dyson Relcis sma kontra objektum modell
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 6

BME IIT, Lszl Zoltn

2012. mrcius 19.

Bevezets
Hogyan lhetjk tl a restartot ? Megoldsok

Objektum

orientlt adatbzisok

Egyszer, gyors, query Nincs transzformci, OO modell

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Tartalomjegyzk

Egy egyszer feladat Megolds erbl


Szerializls

ljen a relcis adatbzis !


Hibernate Java

3.0

Mg absztraktabban !
Persistence API, EclipseLink - PSEPro
8

Maradjunk az OO-nl !
Objectstore

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Egy egyszer feladat

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

2012. mrcius 19.

Feladatdefinci

autk nyilvntartsa
vegynk

fel autt (tulajdonossal) az autkat tulajdonosonknt korltozsok


listzzuk

rendszm egyedi tulajdonos egyedi


Person Car 1 1..* -platenr: String getPlate(): String -name: String getName(): String addCar(Car): void

Applic main(): void

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

10

Tranziens megolds

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

11

Szerializls

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

12

BME IIT, Lszl Zoltn

2012. mrcius 19.

Terminolgia

folyamat (serialization), amelyben egy objektum attribtumait binris formba alaktjuk t.


deflating,

marshalling

az ellenttes folyamatban (deserialization) az adatstruktrt helyrelltjuk a binris formbl


inflating,

unmarshalling

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

13

Kiments
import java.io.Serializable; <mod> class SerializableClass implements Serializable { ... } p j java.io.*; import try { FileOutputStream f = new FileOutputStream(filename); ObjectOutputStream out = new ObjectOutputStream(f); out.writeObject(_SerializableClass); out.close(); } catch(IOException ex) { ... }
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 14

Visszallts
import java.io.*; try { FileInputStream f = new FileInputStream("filename"); ObjectInputStream in = new ObjectInputStream(f); o_ins = (SerializableClass)in.readObject(); in.close(); } catch(IOException ex) { ... } catch(ClassNotFoundException ex) { ... }

Nincs konstruktor hvs !


15

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

2012. mrcius 19.

Szablyok, folyamat
Csak a Serializable interface-t implementl osztlyok (s azok leszrmazottai) szerializlhatak Serializable formlis f li tmbk IGEN java.lang.Object NEM Thread, OutputStream, Socket NEM

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 16

Szablyok, folyamat

writeObject
az

tranzitv

els elforduls trolt, a tbbi csak platformfggetlen azonost ismtelt s te t kirs s NEM fellrs e s
out.writeObject(_a); out.writeObject(_a);

mindegyik nem transient, nem static attribtum legsibb szerializlhattl indul


Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 17

rkls

A - priv_a + publ_a

<<interface>> Serializable

B - priv_b + publ_b

C - priv_c + publ_c
18

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

2012. mrcius 19.

rkls llj !!
private void writeObject(ObjectOutputStream out) throws IOException { throw new NotSerializableException("X"); }

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { throw new NotSerializableException("X"); }

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

19

Szereplk
<<interface>> Serializable <<interface>> ObjectOutput

writeObject it Obj t (Serializable) io.OutputStream MyClass writeObject (ObjectOutputStream)

ObjectOutputStream defaultWriteObject()

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

20

Sajt szerializls
private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); }

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); // inicializls }

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

21

BME IIT, Lszl Zoltn

2012. mrcius 19.

ObjectOutput
public interface ObjectOutput extends DataOutput { public void writeObject(Object obj) throws IOException; public void write(int b) throws IOException; public void write(byte b[]) throws IOException; public void write(byte b[], int off, int len) throws IOException; public void flush() throws IOException; public void close() throws IOException; }

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

22

ObjectInput
public interface ObjectOutput extends DataOutput { public Object readObject() throws ClassNotFoundException, IOException; public int read() throws IOException; public int read(byte b[]) throws IOException; public int read(byte b[], int off, int len) throws IOException; public long skip(long n) throws IOException; public int available() throws IOException; public void close() throws IOException; }

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

23

Szerializlhat mezk

serialPersistentFields

class Datum implements Serializable { int ev, honap, nap; ... private static final ObjectStreamField[] serialPersistentFields i lP i t tFi ld = { new ObjectStreamField("datum", int.class) }; private void writeObject( ObjectOutputStream out ) throws IOException { ObjectOutputStream.PutField adatok = out.putFields(); adatok.put("datum",10000*ev+100*honap+nap); out.writeFields(); }

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

24

BME IIT, Lszl Zoltn

2012. mrcius 19.

Szerializlhat mezk

serialPersistentFields
private void readObject( ObjectInputStream in ) throws IOException, ClassNotFoundException { ObjectInputStream.GetField ObjectInputStream GetField adatok = in.readFields(); in readFields(); int d = adatok.get("datum",0); nap = (int) (d % 100); honap = (int) ((d / 100) % 100); ev = (int) (d / 10000); }

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

25

Helyettests

Interceptor szerializls kzben


visszad

egy objektumot,

amibl amibe szerializlunk


<mod> Object writeReplace() throws ObjectStreamException; <mod> Object readResolve() throws ObjectStreamException;

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

26

Externalizls

Csak az osztly azonostsa mentdik, a tbbi a user kezben.

public interface Externalizable extends Serializable { public void writeExternal(ObjectOutput out) throws IOException; public void readExternal(ObjectInput in) throws IOException, java.lang.ClassNotFoundException; }
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 27

BME IIT, Lszl Zoltn

2012. mrcius 19.

Struktra
<<interface>> ObjectOutput

<<interface>> Serializable

writeObject (Serializable) io.OutputStream MyClass writeObject (ObjectOutputStream)

<<interface>> Externalizable writeExternal (ObjectOutput)

ObjectOutputStream defaultWriteObject()

MyExtClass

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

28

Verzik

Kompatibilis
j

mezkkel bvl -> pers, transient -> pers hozzfrs mdosts rklsi fa bvtse, szktse j writeObject, readObject
static

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

29

Objektum relcis adatbzis

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

30

BME IIT, Lszl Zoltn

10

2012. mrcius 19.

Problma lnyege

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

31

Hibernate 3.0
Open-source Objektumok tblkra lekpezve Lekrdez nyelv A standard DB-hez kapcsoldik Swing, Servlet, J2EE kapcsolat nagy teljestmny

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

32

Jellemzk
(LGPL) Lesser General Public License Lekrdezs

Hibernate Hibernate Hib t

Query Language C Criteria it i Q Query API konkrt DB SQL-je

Eclipse support Teljestmny monitor: JMX, helyi API Automatikus kulcs generls

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 33

BME IIT, Lszl Zoltn

11

2012. mrcius 19.

Jellemzk

Tmogatja az OO-t
rkls,

polimorfizmus, Java Collection

Sklzhat

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

34

Megkzelts

To use Hibernate, it is required to create Java classes that represents the table in the database and then map the instance variable in the class with the columns in the database. Then Hibernate can be used to perform operations on the database like select, insert, update and delete the records in the table. Hibernate automatically creates the query to perform these operations. (Hibernate Reference Documentation 3.2.6)
35

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

A feladat megoldsa

Perzisztens osztlyok kiegsztse


attribtum - ajnlott standard get, set metdusok - ajnlott public no-arg constructor

Long id

Alkalmazs talaktsa
adatbzis

adminisztrci rendszmot, majd Person-t keresnk list - ugyanaz


Car-on
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 36

BME IIT, Lszl Zoltn

12

2012. mrcius 19.

A feladat megoldsa
Perzisztens osztly + asszocicik > tbla mapping Hibernate Hib t configuration xml HSQL DB indtsa Alkalmazs indtsa

37

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Hibernate 3.0 definilsa

Lekpezs
Tag-ek, rkls Asszocici,

tpusok, kollekcik komponens

Mkds
Architektra, Tranzakcik, HQL

objektumok kezelse konkurencia

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

38

Lekpezsek / tag-ek

<hibernate-mapping>

gykrelem

lers egszre vonatkoz paramterek

<class>

perzisztens osztly azonost (ne kompozit !)

21

paramter name, table, .where

<id>

name,

type, column (natural-id kln) <generator> opci, Java class


12 genertor algoritmus: native, sequence, foreign
39

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

13

2012. mrcius 19.

Lekpezsek / tag-ek 2
<property>
name,

Java stlusban property-k csoportja relci relci


40

type, column - 11 paramter

<properties>

<many-to-one>
name, name,

type, column - 14 paramter class 10 paramter

<one-to-one>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Lekpezsek / tag-ek 3

<component>

komponens

<join>

egy osztly tbb tblba

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

41

Lekpezsek / tpusok 1

Entits
egyed,

fggetlenl, hogy van-e r referencia explicit kell menteni s trlni (cascade !) entits referencikbl s Value-kbl ll

Value
primitv,

kollekci, komponens, spec. obj. sajt osztly + value szemantika ments, trls a tulajdonossal egytt
komponens:
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 42

BME IIT, Lszl Zoltn

14

2012. mrcius 19.

Lekpezsek / tpusok 2

Java Hibernate lekpezs


<class>

Entits Value

<component>

<property>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

43

Lekpezsek / tpusok 3
Java tbla oszlop Standard mapping User defined mapping

org.hibernate.usertype plda:

Java SQL int INTEGER String VARCHAR implementlsa

dupla_string

<property name="twoStrings type="org.hibernate.test.DoubleStringType"> <column name="first_string"/> <column name="second_string"/> </property>


Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 44

Lekpezsek / kollekcik 1

Kollekcik interface tpusak


public class Product { private String serialNumber; private Set parts = new HashSet(); }

Hibernate-nek sajt implementcija van. Tilos a konkrt tpusra cast-olni ! Kollekci entits komponense. Magban nem ll.

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 45

BME IIT, Lszl Zoltn

15

2012. mrcius 19.

Lekpezsek / kollekcik 2

Mapping
<class name="Product"> <id name="serialNumber" column="SN"/> <set name="parts"> p <key column="SN" not-null="true"/> <one-to-many class="Part"/> </set> </class>

<set>, <list>, <map>, <bag>, <array>, <<p>-array>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

46

Lekpezsek / kollekcik 3

Kollekcik elemei
Value-k

<element> or <composite-element>

entitsok

referencii

<one-to-many> or <many-to-many>

Pldk

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

47

Lekpezsek / kollekcik 4

String-ek halmaza
<set name="names" table="person_names"> <key column="person_id"/> <element column="person_name" type="string"/> </set>

Integerek bag-je
<bag name="sizes" table="item_sizes order-by="size asc"> <key column="item_id"/> <element column="size" type="integer"/> </bag>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

48

BME IIT, Lszl Zoltn

16

2012. mrcius 19.

Lekpezsek / asszocici 1

Rendszerezs
egy-

vagy ktirny (1:1, 1:n, n:1, n:m) join tblval, vagy nlkle
multiplicits

Pldkban SQL tpus nincs (pl. bigint) A leggyakoribb eset (ktirny, 1:n) az auts pldban

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

49

Lekpezsek / asszocici 2

Plda: egyirny, n:1


create table Person (personId not null primary key, addressId not null) create table Address (addressId not null primary key)

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

50

Lekpezsek / asszocici 3

Egyirny, n:1
<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <many-to-one name="address", column="addressId", not-null="true"/> </class> <class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> </class>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

51

BME IIT, Lszl Zoltn

17

2012. mrcius 19.

Lekpezsek / asszocici 4

Plda: egyirny, 1:1


idegen

kulccsal

create table Person (personId not null primary key, addressId not null unique) create table Address (addressId not null primary key)

kzs

kulccsal

create table Person (personId not null primary key) create table Address (personId not null primary key)

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

52

Lekpezsek / asszocici 5

Egyirny, 1:1
<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> </class> <class name="Address"> <id name="id" column="personId"> <generator class="foreign"> <param name="property"> person </param> </generator> </id> <one-to-one name="person" constrained="true"/> </class>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

53

Lekpezsek / asszocici 6

Plda: egyirny, 1:n, join table


create table Person (personId not null primary key) create table PersonAddress (personId not null null, addressId not null primary key ) create table Address (addressId not null primary key)

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

54

BME IIT, Lszl Zoltn

18

2012. mrcius 19.

Lekpezsek / asszocici 7

Egyirny, 1:n, join table


<class name="Person"> <id name="id" column="personId"/> <set name="addresses" table="PersonAddress"> <k <key column="personId"/> l " Id"/> <many-to-many column="addressId" unique="true" class="Address"/> </set> </class> <class name="Address"> <id name="id" column="addressId"/> </class>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

55

Lekpezsek / komponens

rtk, nem entits referencia


public class Person { private Name name;...} <class name= .... <component name="Name" class="Name"> <property name="first"/> <property name="last"/> </component> </class>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

56

Lekpezsek / rkls 1
Payment id: long amount: int

CredCPayment credCType: String

ChequePayment expDate: String

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

57

BME IIT, Lszl Zoltn

19

2012. mrcius 19.

Lekpezsek / rkls 2

table-per-class-hierarchy
P_ID PAYMENT PAYMT_TYPE AMOUNT CCTYPE EXPDATE

table-per-subclass
PAYMENT P_ID AMOUNT CREDIT_PAYMENT P_ID CCTYPE CHEQUE_PAYMENT P_ID EXPDATE

table-per-concrete-class
CREDIT_PAYMENT P_ID AMOUNT CCTYPE CHEQUE_PAYMENT P_ID AMOUNT EXPDATE

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

58

Lekpezsek / rkls 3

table-per-class-hierarchy

<class name="Payment" table="PAYMENT"> <id name="id" type="long" column="P_ID"/> <discriminator column="PAYMT_TYPE" type="string"/> <property p p y name="amount" column="AMOUNT"/> ... <subclass name="CredCPayment" discriminator-value="CRDT"> <property name="credCType" column="CCTYPE"/> ... </subclass> <subclass name="ChequePayment" discriminator-value="CHEQ"> <property name="expDate" column="EXPDATE"/> ... </subclass> </class>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

59

Lekpezsek / rkls 4

table-per-subclass
<class name="Payment" table="PAYMENT"> <id name="id" type="long" column="P_ID"/> <property name="amount" column="AMOUNT"/> ... <joined-subclass name="CredCPayment" table="CREDIT_PAYMENT"> <key column="P_ID"/> <property name="credCType" column="CCTYPE"/> ... </joined-subclass> <joined-subclass name ="ChequePayment" table="CHEQUE_PAYMENT"> <key column="P_ID"/> <property name="expDate" column="EXPDATE"/> ... </joined-subclass> </class>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

60

BME IIT, Lszl Zoltn

20

2012. mrcius 19.

Lekpezsek / rkls 5

table-per-concrete-class
<class name="Payment"> <id name="id" type="long" column="PAYMENT_ID"> <generator class="sequence"/> </id> <property name="amount" column="AMOUNT"/> ... <union-subclass name="CredCPayment" table="CREDIT_PAYMENT"> <property name="credCType" column="CCTYPE"/> ... </union-subclass> <union-subclass name ="ChequePayment" table="CHEQUE_PAYMENT"> <property name="expDate" column="EXPDATE"/> ... </union-subclass> </class>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

61

Mkds / Architektra

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

62

Architektra
SessionFactory szlbiztos, DB Session egyszl, rvid let Pers. Obj rvid let, egy Session-hz Tranzakci atomicits ConnectionProvider opci TransactionFactory - opci

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

63

BME IIT, Lszl Zoltn

21

2012. mrcius 19.

Objektum llapotok

Session-hz (persistence context) kpest Tranziens


mg g Az

nem kapcsoldott p ( (nincs id-je) j )

Perzisztens
adatbzis tblival sszektve nem kapcsoldik

Lekapcsolt (detached)
mr

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

64

Konfigurls
Configuration

lekpezs a Java osztlyok s a DB kztt nem vltoztathat


Paramterek,

erforrsok megadsa

kdban, fjl, paramter, property

SessionFactory Session
JDBC

nem vltoztathat

kapcsolat, JNDI elrs

Egyb property-k
65

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Azonossg (identits)
foo.getId().equals(bar.getId()) DB foo == bar JVM Session-n Session n bell Hibernate biztostja biztostja, kzttk problmk lehetnek Megolds:

equals()

business

s hash() felldefinilsa key equality


66

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

22

2012. mrcius 19.

Azonossg (identits)
public class X { public boolean equals(Object other) { if (this == other) return true; if (!(other instanceof X)) return false; final X x = (X)other; if (!x.getY().equals(getY())) return false; return true; } public int hashCode() { int result; result = getY().hashCode(); result = 29 * result + getId(); return result; } }
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 67

Objektumok kezelse 1

j perzisztens objektum
X x = new X(...); x.setY = ...; ( ); OR session.persist(x); p ( ); session.save(x);

betlts (ID-t ismerni kell !)


X x = (X)session.load(X.class, ID); OR session.load(x, ID); OR X x = (X)session.get(X.class, ID);
load

exception, get null pointer


68

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Objektumok kezelse 2

Query visszatr
X x = (X)session.createQuery(..).uniqueResult(); List l = session.createQuery(..).list(); Q y( ) (); Iterator i = session.createQuery(..).iterate();

Mi van a listban ?
objektum tuple

tbbes (tmbknt) attribtumok, pl. count()


69

skalr

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

23

2012. mrcius 19.

Objektumok kezelse 3

Perzisztens objektumok mdostsa


tblba

felr: session.flush()

Lekapcsolt objektumok mdostsa Hogyan kapcsoljuk r egy j session session-re re ?


session.update(x) session.merge(x)

nem reloaded

session.saveOrUpdate(x)

Objektum trlse
session.delete(x)
70

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Objektumok kezelse 4

Replikls
Session session = sessionFactory1.openSession(); Transaction tx = session.beginTransaction(); Item item = (Item) session.get(Item.class, new Long(1234)); tx.commit(); session.close(); Session session2 = sessionFactory2.openSession(); Transaction tx2 = session2.beginTransaction(); session2.replicate(item, ReplicationMode.LATEST_VERSION); tx2.commit(); (IGNORE, OVERWRITE, EXCEPTION) session2.close();

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

71

Tranzakcik 1
DB elrs csak tranzakcin bell session DB-objektum kapcsolat session-per-request policy az ajnlott session i nem szlbiztos lbi t szinkronizlni i k i l i memria objektumokra nincs zr
Object Session DB

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

72

BME IIT, Lszl Zoltn

24

2012. mrcius 19.

Tranzakcik 2

Optimista zrols
Alkalmazs

szinten

j session, j verzi j vs. rgi ?

Hossz

Lekapcsolt

session, automata verzi objektumok, automata verzi

Pesszimista zrols - haladknak

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

73

Lekrdezsek 1

Query paramterezse
nv
Query q = s.createQuery(" q.setString("x", "param"); :x ");

pozci
Query q = s.createQuery(" q.setString(0, "param0"); q.setString(1, "param1"); ? ? ");

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

74

Lekrdezsek 2

Query paramterezse
paramterlista
List names = new ArrayList(); y (); names.add("param1"); names.add("param2"); Query q = s.createQuery(".. in (:namesList)"); q.setParameterList("namesList", names);

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

75

BME IIT, Lszl Zoltn

25

2012. mrcius 19.

HQL 1

Hibernate Query Language From


from Department as dept from Department Department, Employee

Join
inner left outer right outer full outer

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

76

HQL 2

Select
objektumok tuple-k

s property-k s listk

Aggregl funkcik
avg(),

sum(), min(), max(), count()

Where kifejezsek order by, group by

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

77

Criteria Query
Criteria crit = s.createCriteria(X.class); crit.setMaxResults(50); List xl = crit.list(); List x2 = crit .add(Restrictions.like("name", "Z")) .add(Restrictions.between("y", minY, maxY)) .list();

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

78

BME IIT, Lszl Zoltn

26

2012. mrcius 19.

Java Persistence API

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

79

Java Persistence API (JPA)


JSR 220: EJB 3.0


http://jcp.org/en/jsr/detail?id=220

Cl: EJB egyszerstse Forrsok: F k


EclipseLink Hibernate

(Toplink)

Lnyeg
POJO

technolgia, Java EE, SE tmogats


80

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Entitsok
An entity is a lightweight persistent domain object. (JSR 220) POJO szerializlhat (ms nem kell)

rkls, rkls

polimorfizmus - OK

Szabvny O-R kapcsolat Lekrdezhetsg Entity Manager (EM) a felgyel

rajta

keresztl rhetk el a szolgltatsok


81

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

27

2012. mrcius 19.

Entity Manager
Persistence context (PC): A perzisztens objektumok futsi krnyezete. Objektum llapotok benne rtelmezhetek. EM jelenti meg Session (hibernate) == EM (JPA) ??? PC lettartam

kontner vagy az alkalmazs menedzseli

tranzakci

alap
82

kiterjesztett
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Persistence Unit
telept csomag O-R lekpezs Lekpezsek, relcik hatskre Java J annotci t i s/vagy / XML standard knyvtr szerkezet Persistence provider konfigurlsa:

persistence.xml

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

83

A feladat megoldsa

EclipseLink http://www.eclipse.org/eclipselink/
is

an advanced object-persistence and objecttransformation framework that provides development tools and run-time capabilities that reduce development and maintenance efforts and increase enterprise application functionality.

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

84

BME IIT, Lszl Zoltn

28

2012. mrcius 19.

A feladat megoldsa

EclipseLink
Integrlhat

Oracle WebLogic Server Glassfish JBoss IBM WebSphere application server SAP NetWeaver Oracle OC4J various web containers (Apache Tomcat, IBM WebSphere CE, SpringSource tcServer)

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 85

A feladat megoldsa

Derby adatbziskezel http://db.apache.org/derby/


nylt

forrskd adatbziskezel tiszta Java Apache License, Version 2.0 csak 2.6 MB begyazott s kliens/szerver md egyszer install
relcis
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 86

A feladat megoldsa

Eclipse struktra

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

87

BME IIT, Lszl Zoltn

29

2012. mrcius 19.

JPA rszletesebben
Entitsok Relcik Lekrdezsek

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

88

Entitsok
@Entity annotci (vagy XML) public vagy protected no-arg konstruktor final kizrva (osztly, metdus, vltoz) Serializable-t S i li bl t implementlni i l tl i ( (rtk tk pm) ) rklhet entitstl vagy POJO-tl POJO rklhet entitstl Kontneren kvl is hasznlhatak

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

89

Entitsok
@Entity public class MyClass implements Serializable { @Basic y Date birthday; } <entity name="mydomain.MyClass"> <attributes> <basic name="birthday"/> </attributes> </entity>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

90

BME IIT, Lszl Zoltn

30

2012. mrcius 19.

Perzisztens elemek

Mez s property alapon is elrhet


hierarchin

bell egysges

@Entity public class MyClass implements Serializable { @Basic Date getBirthday(){...} void setBirthday(Date date){...} }

nem static nem @Transient vagy transient


91

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Perzisztens elemek

Mezk s property-k (@Basic)


primitv byte[],

tpusok, String, wrapperek char[], enum, szerializlhatk Collection, Collection Set, Set List, List Map (generic is)

sszetett, begyazott (@Embedded) Betlts: Eager s Lazy


predefinit: kivtel:

Eager 1:1, 1:N relcik

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

92

Kulcs

Primary Key ktelez Egyszer kulcs - @Id


Primitv, Primary Kulcs

wrapper, String, Date

sszetett kulcs
Key osztly - @IdClass elem : @EmbeddedId

Kulcsgenerls

@GeneratedValue(strategy = GenerationType.X) X = AUTO, SEQUENCE, IDENTITY, TABLE


93

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

31

2012. mrcius 19.

Entitsok letciklusa

Entity Manager
EntityManagerFactory factory = Persistence.createEntityManagerFactory(p_u_name); EntityManager em = factory.createEntityManager(); persistence.xml <persistence-unit name="p_u_name transaction-type="RESOURCE_LOCAL"> <class>Car</class> <properties> <property ...="...."/> </properties> </persistence-unit>

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

94

Entitsok letciklusa

Entity Manager mveletei:


persist refresh remove merge

Tranzitivits
relci cascade

paramtere = (mveletek) + ALL

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

95

Entitsok letciklusa

Entits llapotai

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

96

BME IIT, Lszl Zoltn

32

2012. mrcius 19.

Entitsok egyb mveletei

Entity Manager egyb mveletei:


find getReference flush clear Query

- ksbb

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

97

Relcik

Megegyezik a Hibernate-tel Annotci


@OneToOne,

@OneToMany, @ManyToOne, @ManyToMany

Egy- s ktirny Ktirnynl


tulajdonos inverz

oldal idegen kulcs oldal referencia (mappedBy =)


98

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Relcik
@Entity public class Car implements Serializable { @ManyToOne private Person owner;

@Entity public class Person implements Serializable { @OneToMany(mappedBy = "owner") private Collection<Car> cars = new HashSet();

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

99

BME IIT, Lszl Zoltn

33

2012. mrcius 19.

rkls - Hibernate

table-per-class-hierarchy
P_ID PAYMENT PAYMT_TYPE AMOUNT CCTYPE EXPDATE

table-per-subclass
PAYMENT P_ID AMOUNT CREDIT_PAYMENT P_ID CCTYPE CHEQUE_PAYMENT P_ID EXPDATE

table-per-concrete-class
CREDIT_PAYMENT P_ID AMOUNT CCTYPE CHEQUE_PAYMENT P_ID AMOUNT EXPDATE

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

100

Lekrdezsek

Java Persistence Query Language (JPQL) Statikus lekrdezsek


@NamedQuery,

@NamedNativeQuery

@Entity @NamedQuery(name = "carByplate", query = "SELECT c FROM Car c WHERE c.plate = :rsz") Car c = (Car) em.createNamedQuery("carByplate"). setParameter("rsz", plate). getSingleResult();
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 101

Lekrdezsek

Dinamikus lekrdezsek
run

time string komponls, paramterezssel

Query query = em.createQuery ("SELECT p FROM Product p WHERE p.param2 < :threshold ORDER BY p.param1 ascending"); query.setParameter("threshold", my_threshold); List results = query.getResultList(); .. try {Object o = q1.getSingleResult();} catch (NoResultException e){....}
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 102

BME IIT, Lszl Zoltn

34

2012. mrcius 19.

Lekrdezsek

Natv SQL lekrdezs


A szmozott

konkrt DB nyelve szerint paramterezssel

Query query = em.createNativeQuery("SELECT * FROM Product p WHERE p.param2 < ?1"); query.setParameter(1,my_threshold). setMaxResults(10); List results = query.getResultList();

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

103

Lekrdezsek

Criteria Query - Hibernate


Builder

minta szerint futs kzben

CriteriaQuery cq1 = em.getCriteriaBuilder(). createQuery(); cq1.select(cq1.from(Person.class)); Iterator iter = ((List<Person>) em.createQuery(cq1).getResultList()). iterator();

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

104

Lekrdezsek

SQL Tbbszrs SELECT

Query q = em.createQuery("SELECT p.name, SUM(c.km) FROM Car c, Person p p GROUP BY p p.name"); ); WHERE c.owner=p List<Object[]> result = q.getResultList(); for (Object[] resultElement : result) { String namee = (String) resultElement[0]; Long sumkm = (Long) resultElement[1]; System.out.println(namee + " " + sumkm); }

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

105

BME IIT, Lszl Zoltn

35

2012. mrcius 19.

OO adatbzisok

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

106

Objectstore PSEPro 1
Java objektumok perzisztencija 50 MB adatbzis kezels egy-felhasznls alkalmazsokhoz konkurens session-k az alkalmazson bell fut, nincs kls adatbzis szemtgyjts megoldva

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 107

Objectstore PSEPro 2
query kollekcik kezelse adatbzis helyrellts recovery API a kezelsre k l

adatbzis

mveletek tranzakcik root-ok kezelse (name service) objektumok rsa, olvassa


session-ok,

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

108

BME IIT, Lszl Zoltn

36

2012. mrcius 19.

Alapfogalmak 1

Session
Hozzfrs Krnyezet

az API-hoz az adatbzis elrshez aktv ltrehozott s nem trlt Konkurencia


JVM-en bell JVM-ek kztt

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

109

Alapfogalmak 2

Perzisztencia-kpes (persistence capable)


adatbzisban annotci

trolhat posztprocesszlssal nem rkldik

Perzisztens objektum
Az

adatbzisban trolt objektum


tok, amibe beolvashat az adatbzisbl az objektum lusta betlts
110

llapotai:

res (hollow)

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Alapfogalmak 3

Perzisztens objektum
llapotai:

aktv

Az adatbzisban lev objektum msolata indulskor tiszta vagy koszos (clean or dirty) elveszti a kapcsolatot az adatbzissal

lejrt (stale)

Perzisztencia-tudatos (persistence aware)

egy osztly, ha maga nem perzisztencia-kpes, de hozzfr egy perzisztens osztly attribtumhoz (perzisztens tmb elemhez)
111

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

37

2012. mrcius 19.

Alapfogalmak 4

Tranziens objektum
nincs

az adatbzisban

Tranzitv perzisztencia
p perzisztens

objektum j ltal hivatkozott objektumok szintn perzisztensek bytekdot injektl elnevezse


112

Annotci
Posztprocesszor

Gykr (root)
Adatbzisbeli objektum Naming service

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

A feladat megoldsa

Perzisztens osztlyok kiegsztse


perzisztens importls

kollekcik

Alkalmazs talaktsa
adatbzis

adminisztrci

adatbzis, session, tranzakci

gykerek, query-k,

kollekcik paramterek
113

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

PSEPro rszletek
Szlak s session-k Adatbzisok kezelse Tranzakcik Objektumok hasznlata Kollekcik Lekrdezsek

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

114

BME IIT, Lszl Zoltn

38

2012. mrcius 19.

Szlak s session-k 1

Krnyezet s API
Thread *
0..1

Session *

0..1

Transaction

Current

thread Current session

0..1

Database

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

115

Szlak s session-k 2

Szlak osztoznak a session-n


t1:Thread s1:Session t2:Thread db:Database tr1:Transaction

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

116

Szlak s session-k 3

Konkurens szlak klnbz adatbzis


db2:Database

t2:Thread

s2:Session

tr2:Transaction

t1:Thread

s1:Session

tr1:Transaction

db1:Database

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

117

BME IIT, Lszl Zoltn

39

2012. mrcius 19.

Szlak s session-k 4

Konkurens szlak ugyanaz az adatbzis


t2:Thread s2:Session tr2:Transaction

db1:Database

t1:Thread

s1:Session

tr1:Transaction

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

118

Szlak s session-k 5

session ltrehozsa
public static Session create(String host, java.util.Properties props)

szlak kapcsoldsa p
public void join() public static void leave()

session-hz kapcsold objektumok lteznek fggetlenl a szlaktl szl brmikor jhet-mehet

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 119

Szlak s session-k 6
egyidben egy tranzakci egy sessionhz egyidben egy adatbzishoz kapcsoldhat

tetszleges

szm read-only tranzakcit vgrehajt h jt session i egy update tranzakcit vgz session
public boolean inTransaction() //Session public Transaction currentTransaction() //Session public Session getSession() // Transaction

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

120

BME IIT, Lszl Zoltn

40

2012. mrcius 19.

Szlak s session-k 7

Session terminls
public void terminate() //Session

A session-hz tovbbra is kapcsoldnak az API s perzisztens objektumok Aktv-e a session ?

public boolean isActive() //szlbl

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

121

Adatbzisok 1

Ltrehozs
elfelttel:

aktv session, tranzakciban

public static Database create(String name, int fileMod)

name

fileMod

= XXX.odb = oprendszer-fgg

ObjectStore.ALL_READ, ObjectStore.ALL_WRITE ObjectStore.OWNER_READ, .

DatabaseAlreadyExistsException
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 122

Adatbzisok 2

Megnyits
nem

szmt a tranzakci, lehet mr nyitott

public static Database open(String name, int openMode)

openMod

= nyits ugyanaz jn vissza az aktulis directoryban - lock


123

ObjectStore.UPDATE, ObjectStore.READONLY

Tbbszrs XXX.odx

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

41

2012. mrcius 19.

Adatbzisok 3

Zrs
nincs

tranzakciban, adatbzis nyitva

public void close() // stale objektumok vagy public void close(boolean RetainAsTransient) Session.terminate() vagy ObjectStore.shutdown()

zrs

utn is megmarad

ismtelt nyitskor ugyanazt kapjuk vissza

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

124

Adatbzisok 4

Szemtgyjts JVM-tl fggetlen


adatbzis

zrva session-t megvrja, lock update-re

public Properties GC() // database

konkurens

Trls
db

update-re nyitva, nincs tranzakci trlse kvl


125

db.destroy() // pers. obj - stale

fjlok

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Adatbzisok 5

Sma evolci (verzizs)


Perzisztens Mikor

objektum mdostsa KELL ?

perzisztens attribtum felvtele felvtele, trlse perzisztens attribtum tpusvlts perzisztens attribtumok sorrendjnek vltozsa

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

126

BME IIT, Lszl Zoltn

42

2012. mrcius 19.

Tranzakcik 1
Konzisztens, biztonsgos programrszlet Start

nem type

elrt a nyitott adatbzis =

public static Transaction begin(int type)

ObjectStore.UPDATE_NON_BLOCKING ObjectStore.READONLY_NON_BLOCKING
lock-ok

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

127

Tranzakcik 2

Zrs Update-re commit, RO-ra abort is j


Commit

ments, vltozsok trolsa ments tranzitv perzisztencia perzisztens objektumok llapota lock-ok felszabadtsa

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

128

Tranzakcik 3

Zrs
Commit
public void commit(int retain)

retain:

ObjectStore.

_STALE _HOLLOW _READONLY _UPDATE _TRANSIENT


Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 129

BME IIT, Lszl Zoltn

43

2012. mrcius 19.

Tranzakcik 4

Zrs
Abort

rollback CSAK az adatbzisban

public void abort(int retain)

Konkurencia
zr

kezels adatbzis s tranzakci egytt read-lock, egy update-lock sorban llnak a krsek
tbb
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 130

Objektumok 1

Hogyan lesz perzisztens a tranziens ?


alkalmazs msik

root-t teszi perzisztens referlja fizikailag felr - ObjectStore.migrate()

Memriba betlts
root-bl

vesszk referencia lekrdezsbl fizikai paramterek alapjn olvas


external
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 131

Objektumok 2

Root
create

update tranzakt, adatbzis nyitva

public void createRoot(String name, Object object)


name egyedi di az adatbzisban d tb i b ua. objektum tbb name-hez is kapcsoldhat

primitv retreive

root

db.createRoot("foo", new Integer(5));

X x = (X)db.getRoot("foo");
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 132

BME IIT, Lszl Zoltn

44

2012. mrcius 19.

Objektumok 3

Root
sszerendels root root

vltoztat update tranzak.

public void setRoot(String name, Object object)

trlse update tranzakci


object NEM

db.destroyRoot(String name);

mgtti objektum trlse

Object object = db.getRoot("xxx"); db.setRoot("xxx", null); ObjectStore.destroy(object);

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

133

Objektumok 4

External references

session, tranzakci nlkl referl nem root is hivatkozhat

ltrehozsa

(session, tranzakci) ( )

objektumbl stringbl

public ExternalReference(Object obj)

public static ExternalReference fromString(String s)

referlt

objektum
134

public Object getObject() //Ext.ref UAZ. session


Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

Kollekcik
Class OSHashBag OSHashMap OSHashSet OSHashtable OSTreeMapByteArray OSTreeMapDouble OSTreeMapFloat OSTreeMapInteger OSTreeMapLong OSTreeMapString OSTreeSet OSVector OSVectorList Implements Collection Map Set None (Hashtable) Map Map Map Map Map Map Set Collection List

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

135

BME IIT, Lszl Zoltn

45

2012. mrcius 19.

Query 1
Collection-t implementl szerkezeten minden elemre kirtkelhet boole rtk operandus joker is

literl name

Java primitvek

publikus attribtum s metdus (static is !) free variable

Query q = new Query(Employee.class, "getSalary()<50000"); Collection employees =(Collection)db.getRoot("employees"); Set result = q.select(employees);
Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn 136

Query 2

Paramterezs free variables plda p

public Query(Class elType, String queryExpr [,FreeVariables freeVariables])

FreeVariables fv = new FreeVariables(); fv.put("IS", Integer.TYPE); Query q = new Query(Person.class,"salary>=IS",fv); FreeVariableBindings fvb = new FreeVariableBindings(); fvb.put("IS", new Integer(20000));

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

137

Query 3

Vgrehajts query metdusai

public Set select(Collection coll, [FreeVariableBindings fvb]) public pub c Object p pick(Collection c (Co ect o co coll, , [FreeVariableBindings fvb])

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

138

BME IIT, Lszl Zoltn

46

2012. mrcius 19.

sszefoglals

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

139

Tanulsg

Szerializls
lbbal azrt

hajts

Relcis adatbzis
a tbla az R

JPA
a

keret takar

OO adatbzis
kompromisszum
140

Objektumorientlt SW-tervezs BME IIT, Lszl Zoltn

BME IIT, Lszl Zoltn

47