Title: Programrendszerek Fejleszt
1Programrendszerek Fejlesztése
2A mai eloadás tartalma
- Perzisztencia
- Object serialization API
- ORM
- Hibernate
- Bevezetés
- Architektúra
- Hello world
- Java File
- Mapping file
- Muveletek
- Konfiguráció
- Interfaces
- Mappelés (Kollekciók,Asszociációk,Leszármazások)
- Lekérdezések
- Optimalizálás(fetching and caching)
- Tesztelés
3Perzisztencia
- Perzisztens objektum a létrehozó program
állapotától függetlenül is létezik - Az objektumhierarchia egy részének
kimentése/betöltése transzparens módon - Fájlba (Object Serialization API)
- Kevésbé típusos (bájtsorozat)
- Objektum referenciák?Keresések?Biztonság?
- Objektum orientált adatbázisba
- Nem kellene átkonvertálni(objektum?relációk)
- Még nem elég hatékony az adatkezelés
- Nem népszeruek, kiforratlanok, nincs komplett
implementáció - Relációs adatbázisba
- Nagyon macerás a leképezés/átkonvertálás
4Perzisztencia megvalósítása
- Közös bázisosztály
- Közös tulajdonságok egybegyujtése
- Magunknak kell megírni a muveleteket
- Adatmanipulációs nyelv
- Kiterjeszti a nyelv szintaxisát
- Könnyen megvalósítható
- konkurens hozzáférés
- tranzakciók
- Sérül a hordozhatóság
- Hibrid megoldás (így a leghatékonyabb)
- A Java felépítése támogatja
- Wrapper osztályok, interfészek, adatfolyamok
5Object serialization API
- Sokszor ez is megfelelo lehet, felesleges a
Hibernate - Java 1.1 java.io csomag része volt
- Bázisosztály alapú megoldás (Serializable
interface) - A referenciákat, kapcsolatokat is megorzi
- Hierarchiák is menthetoek vele (fa,gráf, körkörös
hivatkozások) - Elmentés Visszaolvasás
6Egy összetettebb példa
7Obektum Relációs Leképezés (ORM)
- Objektumok automatikus és transzparens
perzisztálása - Java applikációból relációs adatbázisba
- Metadata segítségével írja le a kapcsolatot
- Konverzió 2 reprezentáció között
- A Metadata használata kevesebb ido mint kézzel
megírni - Egy ORM megoldás 4 része
- API az objektumok CRUD (create/read/update/delete)
muveleteire - Lekérdezo nyelv/API az osztályokra és azok
adattagjaira vonatkozóan - A leképezések definiálására egy keretrendszer
- Piszkos adatok ellenorzése,laza kapcsolatok
felderítése, egyéb optimalizáló funkciók
megvalósítása
8ORM megoldások
- Relációs minden relációs modell szerint készül
el - Portabilitás?
- Karbantarthatóság?
- Tárolt eljárások?
- Könnyusúlyú objektum leképezés
- Manuális leképezés
- Ismert tervezési minták rejtik el az SQL kódot
- Középsúlyú objektum leképezés
- Java alapú tervezés
- Az SQL fordítás idoben generálódik
- Az objektumok gyorstárazva vannak
9ORM megoldások
- Teljes objektum leképezés
- Fejlett objektum modellezés
- Kompozíció
- Öröklodés
- Laza, Buzgó betöltés
- Gyorsítótárazási stratégiák
10ORM kérdések
- Hogyan nézzen ki a lementet objektum?
- Hogyan definiáljuk a leképezést leíró metaadatot?
- Hogyan képezzük le a származási hierarchiákat?
- Hogyan kezeljük az objektumok egyezoségét?
- Hogyan muködik együtt az ORM az üzelti logikával
futási idoben? - Mi az objektum életciklusa?
- Milyen aggregáló és rendezo megoldásokat
biztosít? - Hogyan kezeljük az asszociációkat?
- Tranzakciók, párhuzamosság?
- Gyorsítótárazás?
11ORM elonyök
- Fejlesztési ciklus
- Karbantarthatóság
- Sebesség
- Gyártó függetlenség
12Hibernate
- ORMF (Object-Relational Mapping Frameworks)
javahoz - Híd az objektumorientált és a relációs szemlélet
között - Réteg a DB és az alkalmazás között
- A JEMS (JBoss Enterprise Middleware System) része
- Nyílt forráskód
- A leképezéssel kapcsolatos munka 95 át
megspórolja - Támogatja
- OO perzisztens osztályok kezelése,
- asszociációt, öröklodést, polimorfizmust,
- kompozíciót, kollekciót
13Hibernate
- Adat perzisztencia
- Relációs adatbázis
- Objektum vs. Rekord
- Tárolt eljárások
- Kézzel elkészített CRUD (create/read/update/delete
)? - SQL dialektusok (DDL/DML)?
- Objektum orientált adatbázisok?
- Object Relational Mapping ORM
- Adatbázis kezelés
- Üzleti logika
- Serializáció
- Csak együtt kezelheto
- EJB 2.1
- Objektum orientált adatbázisok
- ODMG - Nem népszeruek, kiforratlanok, nincs
komplett implementáció
14Paradigma ütközés/Granularitás
15Paradigma ütközés/Granularitás
- Cím mint
- Külön tábla
- Külön oszlopok
- Külön típus
- User Defined Type SQL kiterjesztés
- Oszlopként
16Öröklodés/Polimorfizmus
- Hogyan tároljuk le?
- Polimorfikus lekérdezés?
17Azonosítás
- Java
- Referencia szerint ()
- Érték szerint (Equals())
- SQL
- Elsodleges kulcs
- Mi legyen az? Név? Független kulcs?
18Viszonyok
19Navigáció
- Navigáció?
- Java egzakt
- Obejktum gráf bejárás x.d.g.getZ()
- SQL tetszoleges
- N1 select problémája
- Minimalizálni kell a kérések számát join
- Elore kell tudnunk mit akarunk lekérni
- User
- User join Billing details
20Az eltérés ára
- 30 a programozó idejébol
- Bonyolult adatbázis absztrakciós réteg
- Projekt bukás lehet
- Az objektum réteg átalakítása, hogy megfeleljen a
relációs rétegnek - JDBC
- Strukturális kényszereket legalább háromszor meg
kell adni (insert/update/delete) - DAO
21Architektúra
22Architektúra
23Architektúra
24Fogalmak
- SessionFactory (net.sf.hibernate.SessionFactory)
Egy tárolóhely a lefordított mappingek részére.
Innen érheto el a Session és a ConectionProvider.
Tartalmazhat egy másod-szintu tárolót, ami a
tranzakciók között használhatók fel processz vagy
klaszterszinten. - Session (net.sf.hibernate.Session) Ez egy rövid
életu objektum, ami egy kapcsolatot reprezentál a
tároló és az applikáció között, Magába foglal egy
JDBC kapcsolatot. Innen kérhetoek el a tranzakció
objetumok. Egy elsoszintu tároló tartozik hozzá a
perzisztens objektumok számára. Amikor lépkedünk
az objektum gráfban, vagy azonosító alapján
keresünk, akkor van rá szükség. - Perzisztens Objektumok Szintén rövid életu
objektumok, amelyek pontosan 1 session-el vannak
kapcsolatban. Amikor a session bezárul, akkor
szabaddá válnak és más applikációs szintek is
használhatják. - Tranziens Objektumok Akkor beszélünk tranziens
objektumokról amikor még sohasem voltak elmentve
(tehát még nem voltak perzisztensek), így például
ezeknek általában még nincs azonosítójuk.
25Fogalmak
- Tranzakció (net.sf.hibernate.Transaction) Rövid
életu objektum ami egy atomi egységet valósít meg
(tehát vagy teljesül az összes muvelet vagy egyik
sem, ha valamilyen hiba folytán nem teljesül
akkor vissza kell tudni vonni a már bekövetkezett
módosításokat). Egy session-ben több tranzakció
is megvalósulhat. - ConnectionProvider (net.sf.hibernate.connection.Co
nnectionProvider) Innen kérhetjük el a JDBC
kapcsolatokat (itt a kapcsolatok tárolódnak is).
Leválasztja az alkalmazást az alsóbb rétegektol
(DataSource, DriverManager). A fejleszto által
implementálható. - TransactionFactory (net.sf.hibernate.TransactionFa
ctory) Itt kérhetjük el a tranzakció
objektumokat. A fejleszto által implementálható.
26Hibernate- felépítés
- 3 rész
- Java osztály
- Relációs adatbázisbeli táblák
- Leíró (descriptor)
- Definiálja a konverziós szabályokat
- A nyelvezete inkább java-centrikus
- 2 fajtája van
- Xml file (.xml.hbm kiterjesztés)
- Annotáció
- Sokan kézzel szerkesztik pedig ? XDoclet,
Middlegen, AndroMDA.
27Hello World Java osztály
- Id ? Elsodleges kulcs az adatbázisban (hibernate
automatikusan generálja) - Getter-Setter minden adattaghoz (JavaBean)
- A java kódban nem kell Hibernate specifikus
dolgokat használni! (nem eroszakos) - Ugyanugy használjuk az osztályt ahogyan eddig
- Message message new Message("Hello World")
- System.out.println( message.getText() )
- Nem kell külön konténer ahogyan EJB-ben
28Hello World - Leíró
29Hello World fo applikáció
30Hello World fo applikáció
31Hello World hibernate.cfg.xml
32Hello World hibernate.cfg.xml
33A hibernate konfigurálása
- Mivel sok a változó azért széles a config
paraméterlista - A hibernate.propertiesbol sok ötletet
meríthetünk. - 2 lehetoségünk van konfigurálásra
- Progaramból állítjuk be a dolgokat
- A hibernate.cfg.xml
- A keresési útvonal gyökerébe kell tenni
- Egyben ki vannak gyujtve a beállítások
- A hbm.xml ek helyét is meg lehet adni benne
- A SessionFactory elkérése SessionFactory sf
- new Configuration().configure().buildSessionFacto
ry() - Több konfig file-t is létrehozhatunk, majd késobb
dinamikusan válogathatunk köztük - SessionFactory sf new Configuration().configure(
"/my/package/catdb.cfg.xml") .buildSessionFactory(
)
34Példák programból történo konfigurációra
- Egy mappinf file regisztrálása
- Configuration cfg new Configuration().addResourc
e("Message.hbm.xml") - Alternatív mód (az osztály regisztrálása)
- Configuration cfg new Configuration()
.addClass(helloWorld.Message.class) - A Properties objektum használata
- Properties props new Properties()
- ...
- Configuration cfg new Configuration()
- .addClass(org.hibernate.auction.Item.class)
- .addClass(org.hibernate.auction.Bid.class)
- .setProperties(props)
35Néhány egyéb config property
A legfontosabb JDBC kapcsolatért felelos
property-k
Property name Purpose
hibernate.connection.driver_ classjdbc driver class
hibernate.connection.url jdbcURL
hibernate.connection.username database user
hibernate.connection.password database user password
hibernate.connection.pool_size maximum number of pooled connections
A Hibernate a kapcsolatokat olykor a Jndi bol
kéri el
Property name Purpose
hibernate.connection.datasource datasource JNDI name
hibernate.jndi.url URL of the JNDI provider (optional)
hibernate.jndi.class class of the JNDI InitialContextFactory (optional)
hibernate.connection.username database user (optional)
hibernate.connection.password database user password (optional)
36Interfészek I.
- Session
- Könnyusúlyú
- A Hibernate viszonyok nem szálbiztosak !
- SessionFactory
- Nem könnyusúlyú
- Szálak között megosztva használható
- Egy adatbázis/egy SessionFactory
- A második szintu gyorstár itt található
- Configuration interface
- Konfigfájlok helye, .
- Transaction interface
- Nem kötelezo használni az adatbázis
tranzakcióit használja
37Interfészek II.
- Query, Criteria
- HQL/SQL lekérdezések futtatása
- Könnyusúlyú
- Callback interfaces
- Lifecycle, Validate CRUD muveletek
- Extension
- Primary key generator
- Sql dialect
38Alap konfiguráció
- Menedzselt környezet
- Gyujteményez (adatbázis kapcsolat, )
- Jboss/GlassFish,
- Nem menedzselt környezet
- Alap párhuzamosság kezelés (szál gyujteményekkel)
- Tomcat/Jetty
39Types
- Egy java típus egy vagy több oszlophoz rendel
- Currency
- Calendar
- Byte
-
- Saját típus
- UserType
- CompositeUserType
40Alkalmazsáfejlesztés
- Gazdag domain model
- Csak a domainra vonatkozó kódot tartalmazza
- Aggodalom/Gond csorgás
- EJB interceptor
- Transzparens perzisztencia
- A kód független a perzisztencia típusától
- Kollekciók az interfészbol származzanak ne az
implementációból - Argumentum nélküli konstruktor
- POJO
- Üzleti metódusok
- Tulajdonságok
- Automatizált perzisztencia
41Követelmények
- Transzparens perzisztencia
- Nincs ososztály, interfész követelmény
- Bárhol felhasználható
- POJO
- Üzleti logika
- Tulajdonságok
- Kollekció típusok
- A kollekció interfész szerint legyenek létrehozva
(HashSet -gt Set) - Kötelezo az üres konstruktor
- Java Bean elnevezési konvenciók
42Alap tulajdonság és osztály leképezés
- Sok default megoldás
- ltproperty name"description" column"DESCRIPTION"
type"string"/gt - ltproperty name"description" column"DESCRIPTION"/
gt - Leszármaztatott értékek (csak select)
- ltproperty name"totalIncludingTax"
- formula"TOTAL TAX_RATE TOTAL"
- type"big_decimal"/gt
- ltproperty
- name"averageBidAmount"
- formula"( select AVG(b.AMOUNT) from BID b
- ?where b.ITEM_ID ITEM_ID )"
- type"big_decimal"/gt
43Tulajdonság kezelo stratégiák
- Hozzáféro függvényen keresztül
- Közvetlenül
- ltproperty name"name"
- column"NAME"
- type"string"
- access"field"/gt
- Inster/Update kezelés
- ltproperty name"name"
- column"NAME"
- type"string"
- insert"false"
- update"false"/gt
44Elnevezési konvenciók
- public class CENamingStrategy implements
NamingStrategy - public String classToTableName(String className)
- return tableName(
- StringHelper.unqualify(className).toUpperCase()
) -
- public String propertyToColumnName(String
propertyName) - return propertyName.toUpperCase()
-
- public String tableName(String tableName)
- return "CE_" tableName
-
- public String columnName(String columnName)
- return columnName
-
- public String propertyToTableName(String
className, - String propertyName)
- return classToTableName(className) '_'
- propertyToColumnName(propertyName)
-
45Használata
- Configuration cfg new Configuration()
- cfg.setNamingStrategy( new CENamingStrategy() )
- SessionFactory sessionFactory
- cfg.configure().buildSessionFactory()
46Objektum identitás
- Objektum azonosság
- Objektum egyenloség
- Adatbázis egyenloség
- ltclass name"Category" table"CATEGORY"gt
- ltid name"id" column"CATEGORY_ID" type"long"gt
- ltgenerator class"native"/gt
- lt/idgt
- ...
- lt/classgt
- Sok kulcs generáló megoldás
- Sajátot is lehet írni
47Objektum modellek
- Több objektum mint tábla
- Entitás
- Érték
- Komponensek
48Származás leképezése
- Minden osztálynak egy tábla
- Egy tábla osztály hierarchiaként
- Alosztályonként tábla
49Asszociációk
- Asszociáció
- Egyirányú
- Kétirányú
- Szülo gyermek viszony
- Láncolt muveletek
50Perzisztencia
51Perzisztencia menedzser
- CRUD
- Lekérdezés
- Tranzakció
- Gyorstár
52Objektumok betöltése
- Azonosító alapján
- HQL
- Kritérium alapján
- Minta alapján
53Betöltés
- Azonnali
- Laza/Lusta
- Mohó
- Kötegelt
54Optimalizálás - Gyorstárak
55Tranzakció
- Adatbázis szintu
- Alkalmazás szintu
56A következo eloadás tartalma
- Alkalmazás keretrendszerek
- J2EE
- JNDI
- RMI
- EJB