Object-Rela+onalMapping
Object-Rela+onalMapping
ProgrammazionediApplicazioniDataIntensive
LaureainIngegneriaeScienzeInforma+cheDISI–UniversitàdiBologna,Cesena
G.Domeniconi,G.Moro,R.PasoliniDISIUniversitàdiBologna,Cesena
Object-Rela+onalMapping
ApproccioObject-Orientedepersistenza
• IlparadigmaObject-Oriented(OO)èl'approcciopiùcomunementeuKlizzatopersviluppareapplicazionimoderne– BasatosuoggeLchesiscambianomessaggi(chiamateametodi)– UsatodailinguaggimodernipiùuKlizzaK(Java,C#,Python,...)
• Durantel’esecuzionediunprogramma,glioggeLsonoresidenKnellamemoriavolaKle(RAM)– Quandol’applicazioneterminavengonopersi
• LeappplicazionirealidevonogesKreanchedaKpersisten:– QuesKdaKdevonosopravvivereallaterminazionedelleapplicazioni
peresseredisponibilinelleesecuzionisuccessive– Nelleapplicazioniweb,nondevonoperdersidaKtrarichiesteoin
seguitoadunriavviodelserver(ades.amanutenzioneoguasto)
2DataIntensiveApplicaKons
Object-Rela+onalMapping
Esempio:unOrdineObject-Oriented
• Tramitelanostrawebapp,unutentepuòeffe\uareordini• NelparadigmaOO,unordineèunogge\ocompostocon
riferimenKadaltrioggeL:l’utente,iprodoLacquistaK,...• Ogniogge\oordineeisuoicomponenKdevonoessere
disponibiliinesecuzionisuccessivedell’applicaione
Invoice
user
26/5/14
2034290
date
oid
items
User... Set ... ...
InvoiceEntry
1quanKty
item
Product...
Bulworth[VHS]name
3DataIntensiveApplicaKons
Object-Rela+onalMapping
Persistenza:DatabaseadOggeL?
• IDBMSadoggeLimplementanoilparadigmaobject-orientedrappresentandol'informazionecomeneilinguaggiOO– EsempidiOODBMS:db4o,perst,DTS/S1,...
• L’usodiquesKDBMSperme\erebbedisalvareereperireoggeLpersistenKinmodoconformeallaOOP
ObjectDatabase db = ... Invoice order = ... db.store( order );
• D’altraparte,nonostanteunastoriadisviluppopiùchedecennale,hannotrovatoscarsoimpiegocommerciale– Nonesisteunostandardsull’interoperabilitàperdiversiOODBMS– NonfornisconofunzionalitàconsolidateneiRDBMS,es.indiciavanzaK
Invoice... ......
4DataIntensiveApplicaKons
Object-Rela+onalMapping
Persistenza:Serializzazione?
• GlioggeLJavaopportunamenteconfiguraKpossonoessereserializzaKinunformatobinario...
• ...esalvaK/recuperaKdaunmediumdimemoriapersistente,e.g.comefiledelfilesystemdiognisistemaoperaKvo
• L’approcciorisolveconsemplicitàlapersistenzadeidaKtraesecuzionidisKntedell’applicazione
• Maèina\uabileanchepermodestequanKtàdidaK,infaLqualsiasiaccessoadessirichiedeladeserializzazione– Ades.percalcolareiltotaledegliordinidovremmodeserializzarlituL:
ilcostointerminiditempo(ememoria)sarebbeinaccetabile• Inoltre,selaclassediunogge\ocambia,ilformatobinario
puòcambiare,invalidandoglioggeLgiàserializzaK
Invoice...
......
0011001101110010100110101011
5DataIntensiveApplicaKons
Object-Rela+onalMapping
DatabaseRelazionali
• Idatabaserelazionalisonolasoluzionepiùado\atapermemorizzareconpersistenzagrandimassedidaKstru\uraK
• IrelaKonaldatabasemanagementsystems(RDBMS)impieganoSQL,unlinguaggiodichiaraKvo– basatosulmodellorelazionale,differentedaquelloadoggeLeda
altriparadigmicomunementeusaKneilinguaggidiprogrammazione
• LamemorizzazionedeidaKavvieneindipendentementedall’applicazionecheviaccede(dataindependence)– IdaKsonoingeneraleaccessibilidapiùapplicazioni,eventualmente
realizzateconlinguaggidiversiedanchebasaKsuparadigmidiversi
• CiononostanteiRDBMSoggisonousaKpergaranKrelapersistenzaanchenelleapplicazioniobject-oriented
6DataIntensiveApplicaKons
Object-Rela+onalMapping
VantaggideiDatabaseRelazionali
IRDBMSnonpresentanoiproblemidellesoluzionidiscussenelleslideprecedenK(OODBMSeserializzazionedioggeL)• Essendolargamentediffusi,hannoraggiuntooLmilivellidi
affidabilità,efficienzaestandardizzazione• SonobasaKsulnotolinguaggiostandardSQL,cheèospitato
all’internodeilinguaggidiprogrammazionepiùcomuni– garanKsceinteroperabilitàtradiversisonware
• Offronofunzionifondamentaliperl’integritàeconsistenzadeidaKancheinmulK-utenza,comeades.letransazioniACID
• IdaKsonoaccessibilidire\amentesullamemoriapersistente– Sipossonosvolgereinmodomoltoefficienteinterrogazionie
operazionidiaggregazionecomplessesenzaportaretuLidaKinRAM
7DataIntensiveApplicaKons
Object-Rela+onalMapping
ImpedanceMismatchProblem
• Ilproblemanell’usodeiRDBMSpergesKredaKdiapplicazioniOOnascedallesostanzialidifferenzetraidueparadigmi– NelparadigmaOOl’informazioneèmodellatainterminidioggeLcon
metodieconproprietàchepossonoessereriferimenKadaltrioggeL– Ilmodellorelazionalerappresental’informazioneconrelazionitravalori
• Impedancemismatchproblemèlanoncorrispondenzatraidueparadigmicheimpediscel’accessoaldbconformementeallaOOP– inognisistemasonwarecherichiedepersistenzadeidaK,almenoil30%
delcodiceèdedicatoarisolverequestoproblema– occorreunasoluzioneproge@ualeeimplementa+vachesiariusabile
Invoice...
......
???
8DataIntensiveApplicaKons
Object-Rela+onalMapping
DifferenzetraOOeModelloRelazionale(1)
• Nozionediiden+tàtraidaK– Nelmodellorelazionale,ogniistanzaèrappresentataconunatuplain
unatabellaesiidenKficaconunachiaveprimaria– NeilinguaggiOO,cisonoduenozionidiidenKtà
• fisica:basatasull’indirizzoinmemoriadeglioggeL(operatore==inJava)• seman+ca:basatasulcontenutodeglioggeL(metodoequalsinJava)• DueoggeLpossonoessereidenKcisemanKcamentemanonfisicamente
• Modalitàdinavigazionea\raversoidaK– NellaOOPlanavigazioneèproceduraletramiteriferimenKtraoggeL
(dovesonodefiniK)– NelmodellorelazionaleèdichiaraKvomediantejointratabelle
DataIntensiveApplicaKons 9
Object-Rela+onalMapping
DifferenzetraOOeModelloRelazionale(2)
• Coesione– Tu\eleproprietàdiunogge\osonocontenutenell’ogge\ostesso
• Un’istanzadellaclasseOrdineèunogge\ocheconKene(riferimenKa)unogge\oClienteed(unriferimentoad)unalistadioggeLDeLaglioordine,ciascunodeiqualiconKene(unriferimentoad)unogge\oProdoLo
– IdaKrelazionalicorrispondenKadunastessaenKtàpossonoesseresuddivisiinpiùtabelle
• UnOrdineèrappresentatodaunatuplanellatabellaOrdiniassociataadunatupladellatabellaClien+edassociataapiùtupledellatabellaDeLaglioordine,ognunaassociataadunatupladellatabellaProdoN
• Incapsulamento– Inunogge\o,lalogicapermanipolareipropridaKrisiedeneimetodi
dell’ogge\ostesso– IdaKrelazionalielalogicaperelaborarlisonoseparaK
DataIntensiveApplicaKons 10
Object-Rela+onalMapping
DifferenzetraOOeModelloRelazionale(3)
• NellaOOPsipossonodefinire+pididatocompos+dicomplessitàarbitraria,inveceinSQLstandardsoloKpiprimiKvi– KpicomposKOOPsonoclassiconunoopiùa\ribuKnonprimiKvi
• OOsupportaiconceLdiereditarietàepolimorfismo– IlinguaggiOOconsentonodidefinireclassicheneestendonoaltree
associazioniconclassigeneriche(astra\e)ointerfacce
• QuestepossibilitànonsonoprevistedallostandardSQL– AlcuniRDBMShannofunzionalitàavanzateperquesKscopi– Ades.PostgreSQLsupportaKpididatocomposKedereditarietàtra
tabelle– Tu\aviaquestecara\erisKchenonsonostandardesonoperciò
incompaKbilitradifferenKRDBMSDataIntensiveApplicaKons 11
Object-Rela+onalMapping
Object-RelaKonalMapping
• Conobject-rela:onalmapping(ORM)cisiriferisceadunasoluzioneproge\ualeeimplementaKvaperrisolverel’impedancemismatchtraiparadigmiOOerelazionale
• GaranKscenelcontempol’astrazionedallecara\erisKcheimplementaKvedellospecificoRDBMSuKlizzato
• MedianteORMsispecificalacorrispondenzatraildominiodeglioggeLdell’applicazioneelabasedidaKrelazionale– Siindividuanonell’applicazioneleclassicorrispondenKadoggeLdi
Kpopersistente– Siassociano/mappanoquesteclassiatabellenelRDBMS– Sidefinisconooperazionicheincapsulanole\uraescri\uraditali
oggeLneldatabaseso\ostante
DataIntensiveApplicaKons 12
Object-Rela+onalMapping
CorrispondenzatraClassieTabelle
• L’ORMsibasasull’associazionediciascunaclassedioggeLpersistenKadunatabelladeldatabase
• Unogge\oèparzialmenterappresentatodaunatuplanellatabellacheinfaLnoncontemplairelaKvimetodi
public class User { ... private int id private String name public int getId() {…} public void setId(…) {…} public String getName() {…} public void setName(…) {…} ...
}
ParadigmaOO RDBMS
id name ...
1 bobby ...
3 tom86 ...
... ... ...
id = 1 name = bobby ...
id = 3 name = tom86 ...
13DataIntensiveApplicaKons
Object-Rela+onalMapping
OggeLPersistenK
• Definiamopersistenteunogge\oacuicorrispondeunatuplaneldatabase,nellatabellacorrispondenteallasuaclasse– Unogge\odellastessaclassepuòancheesserenonpersistente,nelcaso
nonsiastato(ancora)salvatoneldatabase• InJavaunogge\opersistenteèspessounbean(vedilezione
precedente)compostodaproprietàconnomieKpidefiniK– PerogniproprietàpropsonodefiniKimetodigetPropesetProp
• Adogniproprietàcorrisponde,sullatabelladeldatabase:– unsingoloa\ributoavaloriprimiKviedoggeLsemplici(int,String,
…)concorrispondenKKpiSQL(INTEGER,VARCHAR,…)• lachiaveprimariaèinclusatraleproprietà
– piùa\ribuK(ancheinaltretabelle)peroggeLcomposiKchesonoparteintegrantedell’ogge\opersistente
– a\ribuKconchiaviesterneperassociazioniconaltrioggeLpersistenK(integritàreferenziale)
DataIntensiveApplicaKons 14
Object-Rela+onalMapping
Associazionietra\amentonell’ORM
• InambitoORMleassociazionitraclassipersistenKsonotra\ateanalogamentealleassociazioninelmodelloER– un’associazionebinariatraclassipersisten+AeBdeterminarelazioni
traoggeLpersisten+delledueclassi– esempi:unordine(classeA)èemessodaunutente(classeB),
unprodo\o(A)apparKeneaduninsiemedicategorie(B),ognicategoria(A)puòavereunacategoria(B=A)padre(i.e.anello)
• Un’associazionecomportaingeneralelapresenzanellaclasseAdiunaproprietàpilcuiKpoèB(ounacollezionediB)
• Esistonoingeneraleancheassociazionin-arie,cioètranclassi• LeassociazionisonogesKteadeguatamentedall’ORM
– Es.:serecuperounogge\opersistenteemodificounogge\oadessoassociato,occorrerifle\erequestoaggiornamentoanchenelDB
15DataIntensiveApplicaKons
Object-Rela+onalMapping
17
EsempidiAssociazionieCardinalità
• esistono anche altre associazioni, già trattate nel corso di ingegneria del software, riconducibili in termini di mapping alle precedenti – aggregazione e composizione, ereditarietà ...
Società Nome indirizzo
Persona Nome Indirizzo Codice fiscale Data di nascita
* Datore lavoro
impiegato
1
Persona Nome Indirizzo Codice fiscale Data di nascita
marito
moglie dirigente
dipendente
0..1
0..1
0..1
*
persona casa * città possiede
poligono segmenti 3..*
punto ha lati
Situata in
1..*
*
1..* 0..1
* 2
DataIntensiveApplicaKons
Object-Rela+onalMapping
ORMdiassociazioneuno-a-mol+:latouno
• E.g.ogniordine(A)èemessodaunsoloutente(B)• l’associazioneètrado\aconunaproprietàinAdiKpoBossiauser;
ogniuser(B)puòessere“puntato”dapiùordini(A)
• Neldb,questosirappresentaconuna\ributonellatabellaAchiaveesternadellatabellaB(user_idèforeignkey,idèPK)
iduser
123
iduser
234idname
1bobby
id name …
1 bobby …
2 tom86 …
… … …
id user_id …
123 1 …
234 1 …
… … …
ordini
utenti
A B
A B
18DataIntensiveApplicaKons
ordine user
ordine
Object-Rela+onalMapping
NavigabilitàdelleAssociazioni
• LeassociazionibinarietraenKtàsonodefiniteinduedirezioni– Es.:adogniordine(A)èassociatol’utente(B)chel’haemessoeadogni
utente(B)sonoassociaKgliordini(A)chehaeseguito• NeiRDBMS,leassociazionisononavigabilibidirezionalmente
– Possiamosapereviaqueryqualeutentehaemessoundatoordine(A→B)equaliordinisonostaKemessidaundatoutente(B→A)
– ciòavvienepoichéinogniordineèpresentel’IDdell’utentechelohaemessoedSQLrisolvel’associazioneconmatchdivaloriviajoin
• InOOlanavigabilitàdelleassociazionidipendedalleproprietàincorporatenelleclassi– e.g.ogniogge\oInvoice(ordine)haunrif.adunoUser(utente)– PeravereanchegliordinidiogniutenteoccorreunaproprietànellaclasseUser
– Inquestocaso,secambiol’utenteassociatoadunordineconaltroutente,occorreaggiornareanchei2insiemidiordinipuntaKdai2utenK
19DataIntensiveApplicaKons
Object-Rela+onalMapping
ORMdiassociazioneuno-a-mol+:latomol:
• Es.:adogniutente(B)èassociatol’insiemedeisuoiordini(A)• L’associazioneètrado\aconunaproprietàordersnellaclasse
user(B)chehapervaloreunsetdiordini(diclasseA)• Inquestomodol’associazioneutenK-ordiniènavigabile
bidirezionalmente id
name1
bobby
orders
iduser
123
iduser
234
• CiògaranKscelanavigabilitàdeglioggeLcomenelDB– comerisalireagliordinidiunutentesenzalaproprietàorders,?
B A
20DataIntensiveApplicaKons
user
orders
Object-Rela+onalMapping
ORMdiassociazionemolK-a-molK
• Es.:ogniprodoLo(A)puòappartenereapiùcategorie(B)eviceversa
• Pernavigarel’associazionebidirezionalmentesicreaunaproprietàdiKposetsiainB,siainA,comenellaslideprecedente
idname
1234Amovie
idname
2345Amusical
labels
labels
idname
12Movies
idname
23Music
items
items
A B
21DataIntensiveApplicaKons
products category
Object-Rela+onalMapping
ORMdiassociazionemolK-a-molKneldb
• UnarelazionemolK-a-molKsirappresentaingenereinundatabaserelazionaletramiteunatabelladijoin– LatabellaconKenecoppiedichiavidiAeB– InquestomodosonorappresentateinsiemesialarelazionemolK-a-
molKdaAaBchequelladaBadA– Letabelledijoinsipossonoancheusareperassociazioniuno-a-molK
id name …
12 Movies …
23 Music …
… … …
id name …
1234 A movie …
2345 A musical …
… … …
product category prod_id cat_id
1234 12
2345 12
2345 23
… …
labels
22DataIntensiveApplicaKons
Object-Rela+onalMapping
ORM:funzionalitàeproblemidarisolvere
• L’ORMdeveingeneralefornirefunzionalitàper– leggereleinformazionidioggeLpersistenKdaldatabase– scrivereneldatabaseicambiamenKapportaKadoggeL
persistenK,inserendo,aggiornandoedeliminandorighe
• EsistonodiversiaspeLcriKcidagesKre– SerecuperolastessatupladalDBpiùvolte,possoo\enerepiùoggeL
fisicichelarappresentano→possibiliinconsistenze– PerrecuperareoggeLassociaKpossonoservirejoinoulterioriquery,
maglioggeLpotrebberononserviree/oesseregiàreperiK– Inassociazionibidirezionalipossonocrearsiinconsistenzetraivaloridi
dueproprietàcorrispondenK
• PeruKlizzareunasoluzioneORMoccorreseguirealcuniaccorgimenKnonbanaliperchéfunzionicorre\amente
DataIntensiveApplicaKons 23
RDBMS
OOORM
Object-Rela+onalMapping
Evitareaccoppiamentotraapplicazioneedb
• icomponenKdiapplicazionichedevonotra\aredaKpersistenKpossonousareleAPIdeldatasource– e.g.componenKdelmodelcomejavabean,opagineJSP
delviewoservletcherealizzanocontroller• tu\aviaciòintroducestre\oaccoppiamentotraquesK
componenKeildatasourceconconseguenzenegaKve:– aumentalacomplessitàdimigrazionedell’applicazionedaundata
sourceadunaltro– seavvengonocambiamenKneldatasource,quesKcomponenK
devonoalorovoltasubiremodifiche• l’ORMdeveaumentarel’indipendenzadell’applicazionedal
datasourceancheperchépuòassumerevarieforme:– RDBMS,servizioB2Bexchangeesterno,LDAPdatabase,business
serviceaccessibileviaCORBAInternetInter-ORBProtocolosockets
DataIntensiveApplicaKons 24
RDBMS
OOORM
Object-Rela+onalMapping
TreApprocciORM
• consideriamoun’applicazioneincuidevonoesseregesKKdaKpersistenKa\raversoORM
• Rifacendosialpa\ernmodel-view-controller,progeLamol’applicazioneaffinchésiacompostadaclassiche– rappresentanoiconceLdeldominio(model)– incapsulanolabusinesslogicdall’applicazione(controller)– implementanol’interfacciaperl’utente(view)
• Esistonotreprincipaliapprocciall’ORM– integrazionenelleclassiesistenKdimodelecontroller(forzabruta)– creazionediunostratodiastrazionespecificoall’applicazione(DAO,
usatofinoranell’applicazione)– usodiunframeworkORMperlapersistenzachefa\orizzafunzionalità
dipersistenzarendendoleriusabiliperdifferenKprogeLsonware
DataIntensiveApplicaKons 25
Object-Rela+onalMapping
Archite\uradiun’applicazionesenzaORM
Presentazione(view)
Logicadibusiness(controller)
ConceLdeldominio(model)
DriveraccessoRDBMS(es.JDBC)
RDBMS
Codicedell’applicazione
???
26DataIntensiveApplicaKons
ilproge\oeilcodicenoncontemplanostrategiedimappingtraclassi,oggeLedb.L’interazioneconildbèsparsanelcodiceooconnotevoliproblemidimanutenibilitàesenzapossibilitàdiriuKlizzo.
Object-Rela+onalMapping
ORMtramite“forzabruta”
• Nell’approccioa“forzabruta”,l’ORMèdefinitomaèintegratonelleclassideldominio(model)edicontrollo
• Questeclassisonocosìdire\amenteresponsabilidell’interazionecoldatabase– costruzionedicomandiequerySQL– interazionecoldriver(JDBC)– interpretazionedeirisultaK
• PerquestoapprocciononesistonostandardbendefiniK– API,implementazioneeregoledaseguireperl’usodipendono
largamentedallesceltediprogeLsKesviluppatoridellespecificheapplicazioni
27DataIntensiveApplicaKons
Object-Rela+onalMapping
Archite\uraconORMaforzabruta
Presentazione(view)
Logicadibusiness(controller)
ConceLdeldominio(model)
DriveraccessoRDBMS(es.JDBC)RDBMS
ORM
ORM
Codicedell’applicazione
28DataIntensiveApplicaKons
ilproge\oeilcodicecontemplanostrategiedimappingtraclassi,oggeLedb,tu\avial’interazioneconildbèincorporatanelleclassimodelecontroller.Menoproblemidimanutenibilità,maancoraimpossibilitàdiriuKlizzo.
Object-Rela+onalMapping
ORMintegratonelModel:Esempiopublic class Invoice {
campi, getter e setter...
int id;
/** Carica dal database i dati dell’ordine con ID impostato. */
public void loadFromDB() throws SQLException {
try ( Connection conn = ... ) {
try (PreparedStatement ps = conn.prepareStatement( "SELECT ..." ) {
ps.setInt( 1, id );
try ( ResultSet rs: ps.executeQuery() ) {
if ( !rs.next() ) return;
// uso il metodo omologo di User per caricare i dati dell’utente
user = new User();
user.setId( rs.getInt( "user_oid" ) );
user.loadFromDB();
gestione altri campi...
} } }
}
/** Salva sul database i dati di questo ordine. */
public void writeToDB() throws SQLException { ... }
} 29DataIntensiveApplicaKons
Inquestomodo,perreperireunogge\odalDB,ilcontrollerdevecreareunogge\o“vuoto”,impostarel’IDdellatupladacaricareechiamarequestometodo
Object-Rela+onalMapping
ORMintegratonelController:Esempio/** Carica dal database e presenta gli ordini di un utente */
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
User user = getCurrentUser();
List<Invoice> orders = new ArrayList<>();
try ( Connection conn = ... ) {
try ( PreparedStatement ps: conn.prepareStatement( "SELECT ..." ) ) {
ps.setInt( 1, user.getId() );
try ( ResultSet res = ps.executeQuery() ) {
while ( res.next() ) {
Invoice order = new Invoice();
order.setId( res.getInt( "oid" );
gestione altri campi...
orders.add( order );
}
}
}
}
request.setAttribute( "orders", orders );
request.getRequestDispatcher( "WEB-INF/view/UserProfile.jsp" ) .forward( request, response );
} 30DataIntensiveApplicaKons
IlcontrollercreaunoperunoglioggeLordinicorrispondenK
alletupledelDB
Object-Rela+onalMapping
ORMtramite“forzabruta”:pregiedifeL
• Pro:èl’approcciopiùdire\o– semplice(conce\ualmente)daimplementare– efficientenell’esecuzione
• sipuòdecidere,inbaseallanecessità,serecuperareomenoancheglioggeLassociaKaquellirecuperaKdaldb
– siada\ameglioadesigenzespecifiche(es.databasemalproge\aK)
• Contro:piùdifficiledagesKre– lalogicadiaccessoaidaKsimescolacolrestodell’applicazione– maggioreaccoppiamentotraDBeapplicazione:modifichealDB
possonorichiedereintervenKsudiverseparKdell’applicazione– richiedeingeneralepiùcodice,spessoripeKKvo,rispe\oadaltre
soluzioni
• Ada\osolopermodellideidaKmoltosemplici31DataIntensiveApplicaKons
Object-Rela+onalMapping
DAO:layerdigesKonedellapersistenza
• Perapplicazionipiùcomplesse,èopportunoincapsulareleinterazionicoldbinunlayerapposito,unadapter– raccogliendocosìilcodiceORMinuncomponente– Unasoluzionesempliceconsistenell’implementareunostrato
specificoperlapropriaapplicazione
• IllayerècosKtuitodaunoopiùDataAccessObject(DAO)– IDAOsonoun’astrazionedeldatabase:siinterfaccianoconesso
inviandocomandi/querySQLeinterpretandoneirisultaK– L’interfacciadeiDAOoffreoperazioniall’applicazioneperl’accessoai
daKchenonvarianoalvariaredeldatasourceedefiniscemetodicheacce\anoeresKtuisconooggeLdefiniKnelmodel
• Ogniqualvoltal’applicazionedeverecuperareemodificareoggeLpersistenK,lofasemprea\raversoiDAO– IDAOnascondonotuLide\aglideldatabaseallealtreclassi
32DataIntensiveApplicaKons
Object-Rela+onalMapping
ORMconlayerdigesKonedellapersistenzaDAO
Presentazione(view)
Logicadibusiness(controller)
ConceLdeldominio(model)
DriveraccessoRDBMS(es.JDBC)RDBMS
Persistenza(DataAccessObjects)
Codicedell’applicazione
33DataIntensiveApplicaKons
lestrategiedimappingtraclassi,oggeLedb,sonoincapsulatenelDAO.Miglioralamanutenibilitàeriusabilità,mailcodiceèripeKKvoedècomunqueacaricodeglisviluppatoridell’applicazione.
Object-Rela+onalMapping
DAO:vantaggiesvantaggi
• L’usodeiDAOèuKleallaseparazionetralalogicadiaccessoaldatabaseeilrestodell’applicazione– IDAOfornisconounacomodainterfacciadialtolivelloaicontroller– ModificheinternealdatabaserichiedonomodifichesoloaiDAO
• IDAOfornisconopoiglistessivantaggideimetodiforzabruta– semplicitàconce\uale,efficienza,flessibilitàadesigenzespecifiche
• Ilproblemacherimanenell’approccioDAOèlagrandequanKtàdicodicespessorichiestaperl’implementazione– L’implementazionediunsingolometodoDAOpuòrichiederemolte
operazionielementariesplicitesuidriverdeldatabase– Questeoperazionivannoriscri\eperognimetodo,perogniclasse– IlDAOpuòcosKtuirelamaggioranzadelcodicedell’applicazione
DataIntensiveApplicaKons 55
Object-Rela+onalMapping
Esempio:confrontotrailcontrollerpervisualizzareunordine(≈15righe)...
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
int orderId = Integer.parseInt( request.getParameter("id") );
GeneralDAO dao = DataAccess.getGeneralDAO( request );
Invoice order = dao.getInvoice( orderId );
List<InvoiceEntry> items = new ArrayList<>(order.getEntries());
User currentUser = Session.getSessionManager(request).getCurrentUser();
if ( !order.getUser().equals(currentUser) ) {
response.sendError( HttpServletResponse.SC_UNAUTHORIZED );
return;
}
request.setAttribute( "order", order );
request.setAttribute( "items", items );
request.setAttribute("justPlaced", request.getParameter("new") != null);
request.getRequestDispatcher( "WEB-INF/view/OrderDetails.jsp" ) .forward( request, response );
}
56DataIntensiveApplicaKons
Object-Rela+onalMapping
...eilmetododelDAOchereperisceleinformazionidaldatabase(≈50righe)
static final SQL_INVOICE = "SELECT order_date, user_oid FROM estore.invoice WHERE oid=?";
static final SQL_INVOICE_ENTRIES = "SELECT i.oid, i.quantity, i.review_summary, i.review_text, i.score, p.oid, p.name, p.description, p.price FROM estore.invoice_item i JOIN estore.product p ON i.product_oid = p.oid WHERE i.invoice_oid=?";
@Override
public Invoice getInvoice( int id ) {
try {
Invoice invoice = new Invoice();
try ( PreparedStatement stmt =
conn.prepareStatement( SQL_INVOICE ) ) {
stmt.setInt( 1, id );
try ( ResultSet res = stmt.executeQuery() ) {
if ( !res.next() ) return null;
invoice.setId( id );
Calendar date = Calendar.getInstance();
date.setTime( res.getDate( 1 ) );
invoice.setDate( date );
invoice.setUser( getUser( res.getInt(2) ) );
}
}
try ( PreparedStatement stmt = conn.prepareStatement( SQL_INVOICE_ENTRIES ) ) {
stmt.setInt( 1, id );
try ( ResultSet res = stmt.executeQuery() ) {
HashSet<InvoiceEntry> entries = new HashSet<>();
while ( res.next() ) {
InvoiceEntry entry = new InvoiceEntry();
entry.setInvoice( invoice );
entry.setId( res.getInt(1) );
entry.setQuantity( res.getInt(2) );
String reviewSummary = res.getString(3);
if ( reviewSummary != null ) {
Review review = new Review();
review.setSummary( reviewSummary );
review.setText( res.getString(4) );
review.setScore( res.getInt(5) );
entry.setReview( review );
}
Product product = new Product();
product.setId( res.getInt(6) );
product.setName( res.getString(7) );
product.setDescription( res.getString(8) );
product.setPrice( res.getDouble(9) );
entry.setProduct( product );
entries.add( entry );
}
invoice.setEntries( entries );
}
}
return invoice;
} catch ( SQLException ex ) {
throw new DataAccessException( ex );
}
}
DataIntensiveApplicaKons 57
Object-Rela+onalMapping
GeneralizzazionedeimetodiDAO
• Comediscussosopra,tu\eleimplementazionideiDAOsonobasatesuschemifissiricorrenK– perreperireunogge\odaldatabase,ilDAOnecreaunonuovoene
impostaciascunaproprietàusandoidaKo\enuKdaunaquery– persalvareunogge\oneldatabase,ilDAOneleggeivaloridelle
proprietàeliinserisceinuncomandoINSERT – ecosìvia...
• Sipossonoquindidelinearedelleprocedurevalideingeneralepergenerareedeseguireilcodicediquesteoperazioni
• Questeprocedurepossonoessereapplicateinmodosimileperqualsiasiclassediqualsiasiproge\o– Bastaconoscereleinformazioninecessariesulleclassi,suldatabasee
sucomesonocollegaKl’unoall’altroDataIntensiveApplicaKons 58
Object-Rela+onalMapping
Frameworkperlapersistenza
• IframeworkperlapersistenzasonostaKintrodoLpergesKreinmodoefficientel’object-relaKonalmapping
• QuesKframeworkfornisconoimplementazionigenerichedeimeccanismisolitamenteusaKneiDAO– studiateperfunzionaresuquanKpiùcasipossibili– basatesubestprac+cescheoLmizzanol’affidabilitàel’efficienza
• L’usodiquesKframeworkabba\eitempidisviluppo– nonèpiùnecessarioimplementaremanualmenteDAOcomplessi
• Chirealizzal’applicazionedevelimitarsia– configurareilframeworkperspecificarelecorrispondenzetraleclassi
eletabelledeldatabasespecifichedellapropriaapplicazione– usareleAPIdialtolivellodelframeworkperleggereescriveredaK
59DataIntensiveApplicaKons
Object-Rela+onalMapping
Archite\uraconframeworkORM
Presentazione(view)
Logicadibusiness(controller)
ConceLdeldominio(model)
DriveraccessoRDBMS(es.JDBC)
RDBMS
Frameworkpersistenza
Codicedell’applicazione
configurazioneORM
60DataIntensiveApplicaKons
offretuLivantaggideiDAOedeliminailproblemadellaquanKtàeripeKKvitàdelcodiceacaricodeglisviluppatori
Object-Rela+onalMapping
Frameworkperlapersistenza:pregiedifeL
• L’usodiunframeworkgaranKscedeivantaggiimportanK– l’APIdelframeworkdaunaccessofacileallefunzionalità– sollevaglisviluppatoridalcurarelalogicadiaccessoaldatabase– ilframeworkoffresoluzionivalideinmolKcontesKebentestate– èfacilecambiareilmappingtraoggeLetabelle:bastacambiarela
configurazione
• Però– richiedecheildatabasesiabenproge\atoperconsenKreilmapping– leprestazionipossonononessereoLmalirispe\oadunasoluzione
sviluppataadhocperl’applicazione• tu\aviailframeworkpuòoffrireoLmizzazioninonbanalidaimplementare,ades.cachingdeglioggeLinmemoriaRAM,transazionietc.
61DataIntensiveApplicaKons