Programmazione Java Avanzata Hibernate Ing. Gianluca Caminiti Riferimenti Documentazione ufficiale di Hibernate (manuale e JavaDocs) – www.hibernate.org 3.5.2 Hibernate Tools per Eclipse http://download.jboss.org/jbosstools/updates/stable Java Persistence with Hibernate (Manning,2007) – Capitoli 1-4 Beginning Hibernate - From Novice to Professional. (APress, 2006). ORM La persistenza è quella caratteristica delle applicazioni orientate agli oggetti che permette agli oggetti (o alle reti di oggetti) di “sopravvivere” al processo che li ha creati. Gli oggetti che non possiedono tale proprietà si dicono transitori (transient). L’obiettivo della persistenza è raggiunto principalmente mediante l’uso di DBMS relazionali. ORM L' Object-Relational Mapping (ORM) è un paradigma di programmazione che permette l'integrazione fra applicazioni Object-Oriented e sistemi RDBMS. Un applicazione ORM fornisce, mediante un'interfaccia orientata agli oggetti: I servizi inerenti la persistenza dei dati Un’astrazione rispetto alle caratteristiche implementative dello specifico RDBMS utilizzato. ORM: Vantaggi Superamento del disadattamento dell'impedenza tra paradigma relazionale e ad-oggetti (object/relational impedance mismatch). Riduzione della quantità di codice da scrivere. l'ORM presenta una semplice interfaccia per realizzare operazioni di tipo CRUD, che sono per loro natura molto ripetitive e favoriscono la possibilità che vengano commessi errori durante la stesura del codice che le implementa. Approccio stratificato, che isola in un solo livello la logica di persistenza dei dati, a vantaggio della modularità complessiva del sistema. Elevata portabilità rispetto alla tecnologia DBMS utilizzata. ORM: Vantaggi (2) Vantaggi delle applicazioni che supportano ORM: Caricamento automatico della rete degli oggetti secondo i legami di associazione definiti a livello del linguaggio di modellazione del dominio (lazy-loading, cioè caricamento dei dati collegati on-demand). Rilevamento automatico delle modifiche sui dati e aggiornamento implicito (dirty-checking) Gestione della concorrenza nell'accesso ai dati durante conversazioni (sessioni). Conflitti durante la modifica di un dato da parte di più utenti in contemporanea, possono essere automaticamente rilevati dal sistema ORM. Meccanismi di caching dei dati per migliorare le prestazioni di accesso al RDBMS utilizzato. ORM: Vantaggi (3) Uso del design pattern Unit of Work nella gestione delle transazioni, per ritardare tutte le azioni di aggiornamento dei dati al momento della chiusura della conversazione. P.es. è eseguita solo l'ultima di una serie di update su uno stesso dato, oppure non viene eseguita affatto una serie di update su di un dato che in seguito viene eliminato; Il colloquio con il DBMS avviene mediante composizione di query multiple in un unico statement, limitando così al minimo i tempi di risposta dell'applicazione. Conseguenze: miglioramento delle le caratteristiche di correttezza, manutenibilità, portabilità, ecc. Hibernate Hibernate è un middleware che permette di automatizzare la persistenza degli oggetti negli RDBMS. I mapping fra Java e Tabelle del DB sono fissati dall’utente attraverso file XML o annotazioni sul codice. Hibernate permette di scrivere codice che si riferisce agli oggetti Java, automatizzando le operazioni CRUD, tramite la generazione automatica del codice SQL che lega gli oggetti alle tabelle del DB. Esiste un linguaggio di querying (HQL) che fa riferimento ai POJOs E’ possibile creare il codice Java / lo schema del DB, automaticamente a partire dai mapping. E’ possibile partire dal DB per creare le classi (reverse engineering) Hibernate: Struttura public interface Session (Hibernate API) This is the central API class abstracting the notion of a persistence service. The lifecycle of a Session is bounded by the beginning and end of a logical transaction. The main function of the Session is to offer create, read and delete operations for instances of mapped entity classes. Instances may exist in one of three states: transient: never persistent, not associated with any Session persistent: associated with a unique Session detached: previously persistent, not associated with any Session Transient instances may be made persistent by calling save(), persist() or saveOrUpdate(). Persistent instances may be made transient by calling delete(). Any instance returned by a get() or load() method is persistent. Detached instances may be made persistent by calling update(), saveOrUpdate(), …. save() and persist() result in an SQL INSERT, delete() in an SQL DELETE and update() in an SQL UPDATE. Changes to persistent instances are detected at flush time and also result in an SQL UPDATE. Configurazione in Eclipse HibernateExample2ManytoOne HibernateExample3OnetoOne HibernateExample4OnetoMany HibernateExample5ManytoMany HibernateExample6Component