PDA

View Full Version : [JAVA] Perchè usare Hibernate ?


spillo491
11-11-2010, 10:21
Sviluppo ormai da un paio di anni applicazioni web utilizzando Struts 1. Per lo strato di business mi hanno "insegnato" a non utilizzare nessun framework. Faccio direttamente la mia buona query

SELECT * FROM A INNER JOIN B ecc...

e mi popolo i miei POJO manualmente con i set. Idem per INSERT; UPDATE E DELETE.

Mi sto rendendo conto però che non utilizzare tecnologie come Spring e Hibernate sia piuttosto riduttivo, soprattutto con progetti di una certa dimensione.
Da quanto ho capito Hibernate+Spring utilizzano una mappatura delle tabelle del DB su classi Java e si occupano di scrivere il codice SQL puro.
Forse il salto di qualità più importante rispetto al mio approccio si vede nella fase di prelevamento dati (GET). Io devo andarmi a vedere le relazioni tra le tabelle coinvolte, eseguire le varie JOIN e popolare i miei bean con eventuali bean innestati.
Hibernate questo lo farebbe tutto da solo, basandosi sul file xml di mappatura o sulle annotazioni, giusto ?

MEMon
11-11-2010, 10:58
Sviluppo ormai da un paio di anni applicazioni web utilizzando Struts 1. Per lo strato di business mi hanno "insegnato" a non utilizzare nessun framework. Faccio direttamente la mia buona query

SELECT * FROM A INNER JOIN B ecc...

e mi popolo i miei POJO manualmente con i set. Idem per INSERT; UPDATE E DELETE.

Mi sto rendendo conto però che non utilizzare tecnologie come Spring e Hibernate sia piuttosto riduttivo, soprattutto con progetti di una certa dimensione.
Da quanto ho capito Hibernate+Spring utilizzano una mappatura delle tabelle del DB su classi Java e si occupano di scrivere il codice SQL puro.
Forse il salto di qualità più importante rispetto al mio approccio si vede nella fase di prelevamento dati (GET). Io devo andarmi a vedere le relazioni tra le tabelle coinvolte, eseguire le varie JOIN e popolare i miei bean con eventuali bean innestati.
Hibernate questo lo farebbe tutto da solo, basandosi sul file xml di mappatura o sulle annotazioni, giusto ?
Esattamente, e in oltre permette già di disaccoppiare in buona parte la business logic dall'interazione con il database, mi spiego, con hibernate se intendi cambiare db, basta modificare qualche impostazione nel file di config e tutto il resto rimane invariato (questo per dirti che se non hai intenzione di cambiare tecnologia in futuro, potresi anche fare a meno del pattern DAO)
E' tutto un altro mondo e modo di ragionare poi, magari subito può essere un pò difficile come primo approccio, ma poi ringrazierai di usare hibernate.

Spring invece ti viene in aiuto con IoC Inversion of Control, in pratica permette di "iniettare" oggetti e proprietà dentro le classi, senza bisogno che lo faccia tu.

Questo è particolarmente vantaggioso usato ad esempio per iniettare i vari DAO all'interno del service layer, senza quindi che tu debba costruirti una classe, magari statica o singletone che lo faccia per te.

Inoltre spring permette di automatizzare la gestione delle transazioni.

spillo491
11-11-2010, 11:14
Ciao, grazie della risposta.

Interessante quello che mi dici su Hibernate, non mi è però ben chiaro a cosa serva Spring, cioè cosa da in piu ad Hibernate e quando conviene usarlo :confused:

MEMon
11-11-2010, 12:03
Spring non centra nulla con hibernate, e si può usare con o senza hibernate.
Diciamo che può far comodo usare l'IoC con hibernate, grazie al quale è infatti possibile iniettare, ad esempio, la session factory o i dao dentro le classi.

In questo molto astrae ancora di più il livello di accesso ai dati, perchè per esempio sarà poi possibile passare da hibernate a jdbc a jdo cambio poco e niente.

Poi c'è anche la questione delle transazioni, usando hibernate e basta devi gestirle tu, non che sia complicato eh ma è comunque una cosa da ragionarci un attimo, mentre con spring è possibile configurarlo in modo che pensi lui alla transazioni(utile soprattuto nei progetti di grandi dimensioni), ai rollback ecc.

Comunque ti consiglio prima di iniziare con hibernate semplice, così capisci ben bene come funziona, la validità delle sessioni, la persistenza dei pojo ecc... poi magari pensare di integrare il tutto con spring, anche se probabilmente non ne sentirai davvero la necessità.

spillo491
11-11-2010, 12:20
Ok, proverò a fare una cosa per volta e buttarmi per prima cosa su Hibernate.

Ma volendo fare query "complesse" con ad es UNION, select di select, select max ecc .... è possibile con Hibernate ?

MEMon
11-11-2010, 18:02
Ok, proverò a fare una cosa per volta e buttarmi per prima cosa su Hibernate.

Ma volendo fare query "complesse" con ad es UNION, select di select, select max ecc .... è possibile con Hibernate ?

Hibernate ti mette a disposizione 3 possibilità:

HQL: diciamo che è il "linguaggio" usato da hibernate per fare le query, è simile all'sql, la forza dell'hql è che la query viene poi interpretata diversamente da hibernate in base al db che si usa. In poche parole non devi pensarci tu a diversificare le query a seconda che utilizzi postgress piuttosto che mysql o msql.
Criteria: Permette di fare le query sfruttando la modellazione ad oggetti. é uno strumento molto potente e torna utile soprattuto nei casi in cui la query la componi in base a dei parametri.
SQL: puoi anche decidere di fare una query utilizzando lo standard SQL volendo.