HIBERNATE OPEN SOURCE OBJECT/RELATIONAL MAPPING IMPLEMENTATION FOR JAVA PERSISTENCE

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "HIBERNATE OPEN SOURCE OBJECT/RELATIONAL MAPPING IMPLEMENTATION FOR JAVA PERSISTENCE"

Transcript

1 UNIVERSITÀ DEGLI STUDI DI FIRENZE FACOLTÀ DI INGEGENRIA DIPARTIMENTO DI SISTEMI E INFORMATICA HIBERNATE OPEN SOURCE OBJECT/RELATIONAL MAPPING IMPLEMENTATION FOR JAVA PERSISTENCE Jacopo Torrini torrini@dsi.unifi.it Laboratorio di tecnologie del software

2 Indice generale Hibernate 2 1 Introduzione La persistenza in Java Persistenza nelle applicazioni object-oriented Paradigm mismatch Problema della granularità Problema dei sottotipi Problema dell'identità Problema delle associazioni Problema della navigabilità delle associazioni Il problema delle n+1 select ORM Introduzione ad Hibernate Un esempio di applicazione con Hibernate Mapping di una classe con una tabella di un database Configurazione di Hibernate Mapping delle classi persistenti Associazioni tra entità Associazioni many-to-one Associazioni one-to-many Associazioni bidirezionali Ereditarietà Table per concrete class Table per class hierarchy Table per subclass Generazione automatica del database Persistenza con Hibernate Persistence Manager Perisitence lifecycle Identità degli oggetti Persistence Manager Persistenza transitiva Interrogazioni con Hibernate Recuperare oggetti per Id Interrogazioni con HQL Un esempio pratico Installazione dei prerequisiti Java Eclipse Hibernate HSQLDB Creazione di un nuovo progetto Creazione delle classi del dominio Creazione del file di configurazione di Hibernate Creazione dei file di mapping Utilizzo di Hibernate in una classe Test Appendice: lo standard JPA...40

3 3 Capitolo

4 1 Introduzione

5 5 Capitolo 1 Introduzione La persistenza è uno dei concetti fondamentali nello sviluppo di applicazioni sia web che desktop. L'approccio utilizzato nella gestione di dati persistenti rappresenta una decisione chiave che impatta radicalmente sui tempi di sviluppo, la portabilità e la manutenibilità dell'applicazione. Quando si parla di persistenza con Java, si intende normalmente la memorizzazione di dati su un database relazionale con l'utilizzo del linguaggio SQL tramite un'insieme di interfacce standard. Se da un lato questo approccio permette di utilizzare convenientemente tutte le potenzialità offerte dai database relazionali, accedendo anche a quelle funzioni proprietarie che li rendono più performanti o più adatti al particolare caso d'uso, dall'altro introduce una serie di problematiche che vanno dall'obbligo di scrivere ogni query, persino per le operazioni più elementari CRUD (Create Read Update e Delete) col linguaggio SQL, la non portabilità su altri database relazionali dovuta ai vari dialetti di questi ultimi ed infine la differenza tra la rappresentazione di dati del mondo object-oriented e quella del mondo relazionale. A proposito dell'ultimo problema Martin Fowler in [POEAA] propone un'insieme di pattern architetturali per il mapping tra i database relazionali e linguaggi object-oriented. In seguito Gaving King e Christian Bauer forniscono un'implementazione per Java di questi concetti, dando vita al progetto open source Hibernate ([HIA], [JPWH]).

6 2 La persistenza in Java

7 7 Capitolo 2 La persistenza in Java In Java l'accesso ad un database relazionale viene normalmente effettuato tramite le API JDBC (Java Database Connectivity). L'SQL può essere scritto a mano direttamente nel codice Java, o può essere generato al volo durante l'esecuzione del programma. Le operazioni possibili sono operazioni di basso livello, quali l'esecuzione di una query, la valorizzazione dei parametri della query, la possibilità di scorrere tra i risultati dell'interrogazione o leggere il valore dei suoi campi. Nelle applicazioni in ambito Enterprise l'interesse maggiore si concentra soprattutto sul problema della modellazione dei dati e della business logic. In questi ambiti applicativi il codice di accesso ai dati risulta spesso un'operazione meccanica e tediosa, prona ad errori e di difficile manutenibilità. Quello che serve è la possibilità di persistere grafi complessi di oggetti senza occuparsi degli aspetti implementativi di basso livello. Perché allora utilizzare un database relazionale? I database relazionali dominano il mercato della gestione della persistenza dei dati, e di solito sono un requisito e non una scelta progettuale. Sono molti anni che vengono studiati e ottimizzati, rendendoli strumenti performanti e affidabili. Inoltre la stessa base di dati può essere utilizzata da più applicazioni scritte con linguaggi differenti non necessariamente object-oriented. 2.1 Persistenza nelle applicazioni object-oriented Nelle applicazioni object-oriented la persistenza permette agli oggetti di vivere oltre i confini del processo che li ha creati, e gli oggetti possono essere salvati sul disco e ripristinati su richiesta. In questo ambito applicativo, soprattutto quando si utilizza un domain model ([POEAA]), lo stato dell'applicazione è definito da grafi di oggetti tra loro interconnessi. Un'applicazione non lavora quindi direttamente con una rappresentazione tabulare dei suoi dati, contrariamente a quello che succede in una base di dati relazionale, la logica applicativa risiede completamente nella parte Java e non nelle stored procedures del database e viene fatto uso di concetti complessi come l'ereditarietà, il polimorfismo e la composizione. Di contro le operazioni SQL, quali le proiezioni o le join, hanno come risultato rappresentazioni tabellari dei dati. Le differenze presentate vengono comunemente definite dal termine paradigm mismatch, e meritano un'analisi dettagliata. Nel seguito verranno presentate solamente le problematiche derivanti dal paradigm mismatch, mentre nei prossimi capitoli saranno descritte le soluzioni che Hibernate propone. 2.2 Paradigm mismatch Problema della granularità Nel cercare di far corrispondere proprietà di un oggetto Java con colonne di un database relazionale si deve affrontare il problema della differenza di granularità delle due rappresentazioni. Se ad esempio si vuole persistere un oggetto Address, attributo della classe User, su una tabella USERS, è molto probabile che al singolo oggetto Address corrispondano più colonne della tabella USERS, quali la via, il cap, il numero civico ecc. Nonostante che i database relazionali supportino gli user-defined datatypes (UDT), che permettono di creare anche dalla parte relazionale tipi di dato strutturati come Address, l'uso di queste funzionalità rende non molto portabile l'applicazione.

8 2.2.2 Problema dei sottotipi Hibernate 8 In Java, come in tutti i linguaggi object-oriented, l'ereditarietà permette di definire una classe a partire da una superclasse: la sottoclasse eredita attributi e metodi della superclasse. Inoltre un'associazione può essere polimorfica: se ad esempio un attributo di una classe è di tipo A, si può assegnare a tale attributo un'istanza una classe B sottoclasse di A. Nonostante alcuni database definiscano il concetto di type ineritance, la maggior parte di essi non permette l'uso di tabelle che ereditano i campi da altre tabelle. In generale comunque un database non può definire un'associazione polimorfica, in quanto una foreign key viene definita tra un campo di una tabella e una e una sola tabella target Problema dell'identità Quando due oggetti o due record di una tabella devono essere confrontati per determinare se sono identitci, esistono approcci diversi tra gli oggetti Java e i record di un database. In Java abbiamo il concetto di identity, quando due riferimenti sono associati alla stessa istanza di oggetto, e di equality, quando due istanze differenti possono essere considerate uguali per valore (ad esempio il confronto tra due stringhe). Nei database relazionali l'identità di una riga è specificata direttamente dalla chiave primaria della tabella. Spesso la chiave primaria non rappresenta nemmeno un valore caratterizzante la riga, ma serve esclusivamente per individuare in modo univoco il record (chiave surrogata) Problema delle associazioni Nei linguaggi object oriented le associazioni tra entità sono implementate con le object references. Ma nel mondo relazionale un associazione è rappresentata da una foreign key. I riferimenti sono per loro natura direzionali, per cui se si necessita di bidirezionalità nell'associazione, è necessario implementare due riferimenti incrociati, uno per oggetto. Le foreign key invece non hanno direzionalità, rappresentano solo un legame tra record di due tabelle. Per quanto rigurarda la molteplicità delle associazioni, esiste un enorme differenza tra le due rappresentazioni: se da un lato non è semplice determinare la molteplicità di un associazione di una classe Java (ad esempio distinguere one-to-one da many-to-one), differentemente dalle associazioni di un database relazionale, nel mondo object-oriented le associazioni possono essere più complesse: associazioni one-to-many o many-to-many, rappresentate da una collezione di riferimenti ad oggetti. Nei database relazionali queste associazioni non sono possibili o almeno hanno una rappresentazione differente: le associazioni one-to-many non possono essere implementate, devono essere ribaltate come associazioni many-to-one, poiché non è possibile avere un campo che rappresenta una collezione di chiavi esterne. Inoltre le associazioni many-to-many devono essere implementate con una tabella aggiuntiva di associazione Problema della navigabilità delle associazioni Come detto in precedenza, un'istanza di un oggetto Java ha di solito associazioni ad istanze di altri oggetti. Queste associazioni creano un grafo di oggetti strettamente interconnessi. Tramite l'uso di metodi getter dell'oggetto è possibile ottenere le istanze degli oggetti associati, permettendo in pratica la navigabilità tra gli oggetti del grafo.

9 9 Capitolo 2 La persistenza in Java Tutto questo non ha un corrispondente nel mondo relazionale. Quando si esegue una query, si devono stabilire i confini di estrazione dei dati, inserendo nell'interrogazione le join necessarie tra le tabelle da cui estrarre i dati. Una volta eseguita, la query non è modificabile nella struttura per cui non è possibile estendere la ricerca ad altre tabelle se non rieseguendo una nuova query. Un sistema che si prefigge di creare un mapping tra il mondo object-oriented e quello relazionale deve risolvere alcuni meccanismi di interrogazione automatica durante l'esplorazione del grafo degli oggetti. Poiché non è pensabile che il database venga completamente caricato in memoria all'inizializzazione dell'applicazione, è chiaro che il grafo degli oggetti, il cui stato è persistito nel database, deve essere in qualche modo limitato e confinato. Solo durante l'esplorazione delle associazioni, in maniera automatica, devono essere fatte nuove interrogazioni al database per inizializzare rami del grafo di oggetti (ed effettivamente Hibernate fa questo). Sebbene questo meccanismo sembri allettante, nasconde un problema di efficienza piuttosto grosso, problema che, se non affrontato, rischia di rendere estremamente inefficiente un'applicazione. Il problema è conosciuto col nome di n+1 select problem Il problema delle n+1 select 2.3 ORM Si supponga che un oggetto Parent abbia un'associazione uno a molti con una classe Child. Nel caso in cui si debbano richiedere n oggetti di tipo Parent, il numero di query necessarie per avere gli oggetti completamente inizializzati è pari a n+1, di cui: 1 query è necessaria per ottenere le istanze degli oggetti Parent, mentre n servono per inizializzare ciascuna collezione di Child contenuta in ogni Parent. Se si dovesse pensare all'equivalente operazione fatta in un database relazionale, basterebbe una singola query che mette in join il parent e il child per avere tutti i dati richiesti. Object Relational Mapping è il sistema di persistenza automatico e trasparente di oggetti in tabelle di un database relazionale. Ogni oggetto viene persistito nel database tramite l'inserimento di nuovi record i cui campi contengono i valori degli attributi dell'oggetto. Di solito ad ogni oggetto corrisponde un record di una particolare tabella associata alla classe dell'oggetto. L'associazione tra la classe e la tabella viene ottenuta tramite l'utilizzo di file di descrizione (file di mapping), in cui si specificano le modalità di mapping tra gli attributi dell'oggetto e i campi della tabella. Ogni interrogazione viene effettuata utilizzando un linguaggio simil-sql che permette di scrivere query utilizzando il nome delle classi e degli attributi. Le interrogazioni vengono convertite dal tool ORM in istruzioni SQL da eseguire sul database relazionale sottostante. I resultset delle interrogazioni vengono convertiti nei corrispondenti oggetti in maniera del tutto trasparente. Dal punto di vista dello sviluppatore uno strumento ORM permette di effettuare delle richieste di istanze di particolari classi, con filtri basati sulle proprietà delle classi, i cui risultati sono liste di oggetti. Tutti i dettagli sottostanti al livello object-oriented sono praticamente nascosti. In definitiva una soluzione ORM consiste in: API per eseguire le operazioni di base (CRUD) sugli oggetti delle classi persistenti

10 Hibernate 10 Un linguaggio per la costruzione di query sulle classi e le proprietà delle classi Un sistema per specificare il mapping tramite metadata Un sistema interno per l'interazione con oggetti transazionali, per il dirty checking, il fetching delle associazioni lazy. I benefici che si hanno nell'utilizzo di una soluzione ORM sono svariati: Produttività: il codice che si occupa della persistenza dei dati è la parte forse più tediosa di un'applicazione. Un tool ORM elimina molto di questo codice, semplificandolo e automatizzandolo al massimo Manutenibilità: dovendo scrivere meno codice è più facile manutenere l'applicazione. Inoltre in soluzioni fatte a mano, che trasformano il modello ad oggetti in query relazionali e record di database in oggetti, è molto più difficile far variare il modello di dominio insieme al modello relazionale. Con un tool ORM si mantengono separati i due modelli tramite l'uso di uno strato intermedio di mapping, che spesso minimizza anche la propagazione di variazione tra i due modelli. Performance: anche se a prima vista sembra che lo strato aggiuntivo di mapping introduca dei perggioramenti alla performace, ci sono talmente tante opzioni di ottimizzazioni (utilizzo di cache di primo e secondo livello, utilizzo di batch query ecc) che in realtà, in applicazioni con un numero elevato di accessi in lettura, è possibile ottenere delle performance estremamente più efficienti di una semplice soluzione basata su SQL. Indipendenza dal tipo di database: questa è una delle caratteristiche più interessanti di uno strumento di ORM, il quale astrae l'applicazione dal sottostante database SQL e dal suo dialetto. ORM introduce un linguaggio proprietario per le interrogazioni e le operazioni CRUD. Questo linguaggio viene poi convertito automaticamente nell'sql del database sottostante. Cambiano un parametro nella configurazione dell'orm, è possibile portare l'applicazione su altri database senza praticamente toccare una riga di codice. Inoltre l'orm conosce molto bene (spesso molto meglio del programmatore) il dialetto del particolare database, e ottimizza le query utilizzando quanto più possibile funzioni SQL proprietarie.

11 3 Introduzione ad Hibernate

12 Hibernate 12 Hibernate cerca di essere una soluzione completa al problema della gestione di dati persistenti in Java. Si pone nel mezzo tra l'applicazione e un database relazionale, lasciando lo sviluppatore libero di concentrarsi sugli aspetti di business dell'applicazione. Hibernate non è una soluzione intrusiva e si adatta bene ad applicazioni nuove ed esistenti, e non richiede modifiche distruttive al resto dell'applicazione. 3.1 Un esempio di applicazione con Hibernate Prima di approfondire i concetti fondamentali per l'utilizzo di Hibernate, è utile dare un occhiata al codice per eseguire operazioni di base di tipo CRUD, giusto per avere un'idea della complessità di utilizzo. Questo esempio mostra come rendere persistenti e come ottenere la lista di istanze di una classe User. Definiamo la classe User: Listato 3.1: La classe User public class User{ private Long id; private String name; private String lastname; public User() { public User( String name, String lastname ){ this.name = name; this.lastname = lastname; public Long getid(){ return id; public void setid( Long id ){ this.id = id; public String getname(){ return name; public void setname( String name ){ this.name = name; public String getlastname(){ return lastname; public void setlastname( String lastname ){ this.lastname = lastname; Il codice che salva su database un'istanza di User è il seguente

13 13 Capitolo 3 Introduzione ad Hibernate Listato 3.2: Rendere persistente un'istanza User user = new User( Beppe, Rossi ); Session session = getsessionfactory().opensession(); Transaction tx = session.begintransaction(); session.save( user ); tx.commit(); session.close(); Ovviamente sono stati omessi tutti i dettagli relativi al metodo getsessionfactory(), al mapping tra la classe User e il database e non è ancora stato spiegato cosa sono gli oggetti Session e Transaction, interfacce definite in Hibernate. Dall'esempio risulta chiara comunque la semplicità con cui si rende persistente un oggetto Java: si istanzia, si apre una transazione, si chiama il metodo save() di Session e si esegue il commit della transazione. Niente di più. L'oggetto Java verrà persistito sul DB nella tabella associata alla classe User, come nuovo record della tabella. Ogni proprietà dell'oggetto sarà salvata in una colonna distinta della tabella. L'esempio che segue restituisce l'istanza di User il cui id (di tipo Long) è pari a 10: Listato 3.3: Ricerca per Id Session session = getsessionfactory(); Transaction tx = session.begintransaction(); User users = (User) session.get( User.class, new Long(10) ); tx.commit(); session.close(); Per recuperare tutte le istanze di User salvate nel database: Listato 3.4: Lista di tutti gli User Session session = getsessionfactory(); Transaction tx = session.begintransaction(); List<User> users = session.createquery( select u from User u ).list(); tx.commit(); session.close(); Infine per cancellare un'istanza persistente: Listato 3.5: Cancellazione di un'istanza User user =... //user e' un istanza persistente caricata dal database Session session = getsessionfactory(); Transaction tx = session.begintransaction(); session.delete( user ); tx.commit(); session.close();

14 3.2 Mapping di una classe con una tabella di un database Hibernate 14 Come introdotto nel precedente capitolo, per rendere persistente una classe è necessario specificare un mapping tra la classe e il database. Hibernate utilizza dei file XML per definire questa associazione 1. Ogni classe persistente ha il suo file di mapping associato. Di solito il file XML sta nello stesso package della classe persistente e ha lo stesso nome della classe con estensione.hbm.xml. Il file di mapping per User ha quindi nome User.hbm.xml. Listato 3.6: User.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="domain"> <class name="user" table="users" > <id name="id" column="id" type="long"> <generator class="native" /> </id> <property name="name" column="name" type="string" /> <property name="lastname" column="last_name" type="string" /> </class> </hibernate-mapping> Al di là dei dettagli sull'intestazione del file XML, è possibile notare come il mapping venga definito tramite: un elemento <class> in cui è specificato il nome della classe Java e la tabella corrispondente del database. All'interno di <class> si trova la definizione dell'id dell'oggetto tramite l'elemento <id>, in cui si definisce quale sia la politica di generazione di tale id. Nell'esempio viene definito un id con una politica che delega al database sottostante il compito di creare l'id (ad esempio un campo auto-increment) tramite l'elemento <generator class= native >. Seguono poi le definizioni delle proprietà tramite l'elemento <property>, ognuna delle quali viene mappata con una colonna della tabella. Non tutto quello che è stato scritto sul file XML è necessario. Hibernate è in grado, ad esempio, di inferire il tipo di dato a partire dalla proprietà della classe Java, rendendo superfluo l'attributo type dell'elemento <property>. Pure l'attributo column, che specifica il nome della colonna associata, può essere omesso. Così facendo Hibernate assume che la colonna abbia lo stesso nome della proprietà. 3.3 Configurazione di Hibernate Per poter utilizzare Hibernate deve essere costruita innanzitutto una SessionFactory. La SessionFactory, come dice il nome, è la factory che permette la creazione di una Session di Hibernate, la quale può essere vista in maniera semplicistica come la cache delle istanze di oggetti Java persistenti e permette l'interazione con il database (la Session viene trattata in 1 Esiste un'alternativa all'utilizzo dei file XML per la creazione del mapping, ossia l'utilizzo delle Java annotations. Questo presuppone l'utilizzo di una distribuzione Java uguale o superiore alla 5 e l'utilizzo di alcune librerie aggiuntive che rendono Hibernate un'implementazione per JPA (si veda a tal proposito 8 Appendice: lo standard JPA

15 15 Capitolo 3 Introduzione ad Hibernate maniera approfondita nel seguito). La SessionFactory deve essere creata una sola volta, è molto dispendiosa a livello di risorse e contiene tutti gli aspetti di configurazione per l'accesso ad un database. La SessionFactory viene configurata attraverso un file XML di nome hibernate.cfg.xml che normalmente risiede nella root del classpath: Listato 3.7: hibernate.cfg.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" " <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.driver</property> <property name="hibernate.dialect">org.hibernate.dialect.mysqldialect</property> <property name="hibernate.connection.url">jdbc:mysql://localhost/testdb> <property name="hibernate.connection.username">testdbuser</property> <property name="hibernate.connection.password">testdbpasswd</property> <property name="hibernate.connection.provider_class"> org.hibernate.connection.c3p0connectionprovider </property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_period">3000</property> <mapping resource="domain/user.hbm.xml" /> </session-factory> </hibernate-configuration> Il file specifica: il driver JDBC di connessione al database il tipo di dialetto per il particolare database da usare; cambiando dialetto e driver è possibile usare un qualsiasi altro database (tra quelli supportati da Hibernate, e sono davvero tanti) senza modificare assolutamente l'applicazione I parametri di connessione al database Il gestore del pool di connessioni al database (in questo caso c3p0) I file di mapping (hbm.xml) da usare per definire le classi persistenti La SessionFactory viene inizializzata tramite le seguenti righe di codice: Listato 3.8: Inizializzazione della SessionFactory Configuration cfg = new Configuration(); SessionFactory sessionfactory = cfg.configure().buildsessionfactory(); Come già detto, la SessionFactory deve essere istanziata una sola volta (almeno una per database utilizzato all'interno della stessa applicazione) e deve essere accessibile in ogni parte dell'applicazione in cui è necessario interagire con un oggetto di tipo Session. Per

16 Hibernate 16 questo normalmente la SessionFactory viene incapsulata dentro un singleton ([GOF]) o, in ambito di applicazioni web, come risorsa JNDI ([JNDIT]) o come variabile di una sessione HTTP.

17 4 Mapping delle classi persistenti

18 Hibernate 18 Una delle cose interessanti che differenziano Hibernate da altri sistemi di persistenza (ad esempio gli entity beans nella vecchia specifica EJB2) consiste nel fatto che le classi che devono essere rese persistenti, e qui in seguito chiamate entità, non devono implementare alcuna interfaccia. In pratica un qualsiasi modello di dominio composto da semplici classi Java (comunemente chiamate POJO, Plain Old Java Objects) possono essere rese persistenti con Hibernate. La persistenza in Hibernate è trasparente, ossia gli oggetti Java non conoscono assolutamente il database sottostante e non conoscono nemmeno il loro stato di persistenza. Il meccanismo di persistenza è esternalizzato verso un persistence manager (la Session di Hibernate). La trasparenza di Hibernate in realtà impone alcune specifiche sulle classi da persistere: ogni classe deve avere il costruttore di default e, a meno di altre configurazioni particolari, Hibernate usa metodi setter e getter per impostare i valori nelle proprietà di un oggetto. Questa limitazione è del tutto plausibile, anche perché normalmente ogni oggetto Java implementa i metodi richiesti da Hibernate. Infine, tutti gli attributi che rappresentano una collezione di oggetti devono utilizzare l'interfaccia della collezione (ad esempio Set o List) e non una delle loro implementazioni (HashSet o ArrayList), ma anche questa è una buona pratica di progettazione di una classe di dominio. 4.1 Associazioni tra entità Associazioni many-to-one In un modello di dominio ogni classe ha un'insieme di attributi i cui valori possono essere o un dato primitivo, includendo anche per estensione quegli attributi il cui tipo è assimilabile ad un dato primitivo (String, Date, Long, Integer ecc), o un'associazione ad un'entità, ossia un oggetto il cui tipo è una classe persistente del modello di dominio (per adesso si ignorano le collezioni di oggetti). Come visto in precedenza, il mapping dei dati primitivi è definito, nel file di mapping associato alla classe persistente, tramite l'elemento <property>, assegnando il corretto valore all'attributo type. Quando invece un attributo è un riferimento ad un'altra classe del modello di dominio, abbiamo un'associazione tra entità. Le associazioni tra entità vengono rappresentate, nel mondo relazionale, con relazioni many-to-one. Infatti se ogni classe del modello di dominio corrisponde ad una tabella del database, la relazione tra due entità altro non è che l'associazione tra due tabelle fatte tramite foreign key. Riprendendo l'esempio del paragrafo 3.2 Mapping di una classe con una tabella di un database, viene aggiunta una nuova entità, la classe Department, che rappresenta il diparitmento di appartenenza dell'utente. La classe User viene aumentata con un riferimento ad un'istanza di Department. User Department La classe Department sarà così definita:

19 19 Capitolo 4 Mapping delle classi persistenti Listato 4.1: La classe Department public class Department{ private Long id; private String name; private int depcode; public Department(){ public Long getid(){ return id; public void setid( Long id ){ this.id = id; public String getname(){ return name; public void setname( String name ){ this.name = name; public int getdepcode(){ return depcode; public void setdepcode( int depcode ){ this.depcode = depcode; La classe User viene così modificata (le parti in grassetto sono le aggiunte): Listato 4.2: La classe User modificata public class User{ private Long id; private String name; private String lastname; private Department department; public User() {... //metodi getter e setter dei vecchi attributi public Department getdepartment(){ return department; public void setdepartment( Department department ){ this.department = department; Il file di mapping per Department è il seguente:

20 Hibernate 20 Listato 4.3: Department.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="domain"> <class name="department" table="departments" > <id name="id" column="id" type="long"> <generator class="native" /> </id> <property name="name" column="name" type="string" /> <property name="depcode" column="dep_code" type="integer" /> </class> </hibernate-mapping> Il file di mapping di User viene modificato in questo modo (le parti aggiunte sono in grassetto): Listato 4.4: User.hbm.xml modificato <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="domain"> <class name="user" table="users" > <id name="id" column="id" type="long"> <generator class="native" /> </id> <property name="name" column="name" type="string" /> <property name="lastname" column="last_name" type="string" /> <many-to-one name= department class= Department column= dep not-null= true /> </class> </hibernate-mapping> Questo secondo file contiene l'elemento <many-to-one>, il quale definisce l'associazione tra la classe User e la classe Department come molti-a-uno tra le due tabelle corrispondenti. Nel database la relazione tra l'utente e il dipartimento viene implementata tramite la chiave esterna definita dal campo dep della tabella USERS. Da notare l'attributo not-null, che specifica la nullabilità della proprietà, rafforzando a livello di codice Java i vincoli del campo del database, permettendo così ad Hibernate di controllare che non ci siano vincoli non soddisfatti prima dell'inserimento nel database. Inoltre questo attributo permette di far stabilire ad Hibernate la precedenza di salvataggio delle entità in caso di persistenza transitiva (si veda 5.5 Persistenza transitiva) Associazioni one-to-many Con Hibernate è possibile gestire attributi che sono collezioni di entità. Nel modello di dominio questi attributi devono essere definiti tramite l'interfaccia che definisce il tipo di collezione (Collection, List, Set, ecc), e sono specificati nel file di mapping tramite un elemento di tipo <bag>, <set> o <list>. Si supponga ad esempio che il modello di dominio sia rappresentato dalla seguente

21 21 Capitolo 4 Mapping delle classi persistenti associazione tra User e Department: User Department In questo caso non abbiamo più l'associazione tra User e Department, bensì un attributo di tipo Set di User (non si accettano duplicati) nella classe Department. Listato 4.5: La classe Department modificata public class Department{ private Long id; private String name; private int depcode; private Set<User> users = new HashSet<User>(); public Department(){... //metodi getter e setter public Set<User> getusers(){ return users; public void setusers( Set<User> users ){ this.users=users; La prima cosa che deve essere notata è che nei database relazionali questo tipo di associazione non esiste. Il legame tra le tabelle permette di specificare una sola foreign key per campo verso i record di un'altra tabella. Le tabelle del database quindi non subiscono alcuna modifica, e la relazione è sempre implementata dalla chiave esterna definita sul campo dep della tabella USERS. Nel mondo Java il modello viene invece ribaltato e si concentra l'attenzione sulla relazione di aggregazione tra il dipartimento e i suoi utenti. Il file di mapping di Department viene così modificato:

22 Hibernate 22 Listato 4.6: Department.hbm.xml modificato <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="domain"> <class name="department" table="departments" > <id name="id" column="id" type="long"> <generator class="native" /> </id> <property name="name" column="name" type="string" /> <property name="depcode" column="dep_code" type="integer" /> <set name="users" table="users" lazy="true"> <key column="dep" not-null="true" /> <one-to-many class="user" /> </set> </class> </hibernate-mapping> L'elemento <set> è composto da: l'attributo name, nome della proprietà l'attributo table, nome della tabella associata l'attributo lazy, che se impostato a true permette di non inizializzare subito la collezione quando l'oggetto viene caricato dal database; la collezione verrà valorizzata quando vi si accederà per la prima volta l'elemento <key> che definisce la chiave esterna nella tabella USERS l'element <one-to-many> che definisce il set come una relazione tra entrità one to many e l'entità contenuta nella collezione è del tipo User Associazioni bidirezionali Le relazioni many-to-one e one-to-many appena viste possono essere fuse insieme per creare una relazione bidirezionale. Normalmente è utile modificare il modello delle classi in modo da avere nella classe dalla parte one (quella che contiene la collezone) un metodo add che si occupa di aggiungere alla collezione il nuovo elemento e di impostare nell'elemento un riferimento all'oggetto a cui si aggiunge: Listato 4.7: Aggiunte alla classe Department... public void adduser( User user ){ users.add( user ); user.setdepartment( this );... La relazione bidirezionale contiene un problema di aggiornamento multiplo: se specifichiamo nei file di mapping sia la proprietà many-to-one sia quella one-to-many, abbiamo due rappresentazioni differenti alla stessa foreign key. Per cui l'aggiunta di un nuovo utente ad un dipartimento viene intesa da Hibernate come un doppio aggiornamento

23 23 Capitolo 4 Mapping delle classi persistenti alle istanze persistenti. Hibernate non rileva trasparentemente il fatto che due modifiche si riferiscono alla stessa colonna di database, poiché non è stato ancora indicato da alcuna parte la bidirezionalità dell'associazione. Per fare in modo che venga effettuato un solo update è necessario aggiungere l'attributo inverse all'elemento <set> di Department.hbm.xml. Con questa indicazione, Hibernate considererà solamente le modifiche fatte dalla parte di User, e in particolare quando viene settato l'attributo department. Le aggiunte fatte solo dalla parte della collezione di Department verranno ignorate: Listato 4.8: Department.hbm.xml con l'attributo inverse <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="domain"> <class name="department" table="departments" > <id name="id" column="id" type="long"> <generator class="native" /> </id> <property name="name" column="name" type="string" /> <property name="depcode" column="dep_code" type="integer" /> <set name="users" table="users" lazy="true" inverse="true"> <key column="dep" not-null="true" /> <one-to-many class="user" /> </set> </class> </hibernate-mapping> 4.2 Ereditarietà Una delle problematiche introdotte nel paragrafo 2.2 Paradigm mismatch che un tool di ORM deve affrontare è il mapping di classi che appartengono ad una gerarchia di ereditarietà. Hibernate offre almeno tre soluzioni differenti di mapping: Table per concrete class: Si usa una tabella per ogni classe concreta (non astratta). Table per class hierarchy: Si usa una sola tabella per tutte le classi di una gerarchia. Table per subclass: Si usa una tabella per ogni classe, concreta o astratta che sia Table per concrete class Tutte le proprietà delle superclassi sono inserite nella tabella associata alla classe concreta. Questo tipo di mapping non supporta molto bene le associazioni polimorfiche. Si supponga ad esempio di avere una classe Client che ha un'associazione con una classe Super, super-classe di una gerarchia di altre due classi Sub1 e Sub2. Le tabelle risultanti saranno solo 3, chiamate rispettivamente C, S1 e S2. Risulta impossibile determinare quale sia la tabella della gerarchia di classi verso cui associare la foreign key di C, in quanto non esiste una tabella associata a Super e la scelta di una tra S1 o S2 sarebbe ovviamente errata.

24 4.2.2 Table per class hierarchy Hibernate 24 Una intera gerarchia di classi viene mappata in un'unica tabella. Tutte le proprietà della gerarchia di classi vengono fuse insieme. Un campo della tabella serve da discriminante per determinare il tipo di classe associato al record. Hibernate istanzia correttamente la classe concreta tenendo conto di quest'ultimo. I vantaggi di questo approccio sono diversi: è possibile usare associazioni polimorfiche a oggetti di gerarchie di classi mappate con questa strategia. Infatti nella stessa tabella coesistono record associati a istanze di tipo diverso. L'interrogazione è molto veloce poiché include una sola tabella (a differenza del prossimo tipo di mapping che utilizza più tabelle) Di contro nella stessa tabella confluiscono campi associati a proprietà di classi che possono stare su rami differenti della stessa gerarchia. Questi possono avere senso per un ramo e non averne per un altro. Per cui Hibernate ha bisogno di poter rendere nulli tutti quei campi dei record per cui essi non hanno motivo di esistere. Questo comporta di dover rendere nullabili tutti i campi che si differenziano nella gerarchia, perdendo un'importante funzionalità di controllo dei valori di un campo Table per subclass L'ultima opzione è quella in cui si crea una tabella per ogni classe della gerarchia, che sia astratta o meno. Le tabelle vengono messe in join con una foreign key sulla chiave primaria. Ogni volta che viene fatto un inserimento, le proprietà di ogni classe della gerarchia vengono suddivise in più record, ognuno dei quali viene salvato nella tabella corrispondente. Le interrogazioni vengono effettuate eseguendo una outer join su gli id di tutte le tabelle incluse nella gerarchia. In questo modo i record che vengono recuperati sono composti dall'unione di tutti i campi di tutte le tabelle, ma ogni record ha valorizzati (diversi da null) soltanto i campi che hanno senso per il tipo di oggetto da istanziare associato al record. L'aspetto positivo di questo modello è che è completamente polimorfico. Inoltre può evolvere in maniera naturale insieme all'aggiunta di nuove classi nella gerarchia: è sufficiente aggiungere una nuova tabella in join con quella della superclasse. Il lato negativo è che le interrogazioni possono subire (a seconda del database sottostante) dei rallentamenti, in quanto le outer join sono più dispendiose. 4.3 Generazione automatica del database Un aspetto interessante di Hibernate è la capacità di generare il database a partire dai file di mapping. Effettivamente i file di mapping contengono tutte le informazioni necessarie per costruire lo schema. Inoltre, nel file di mapping, è possibile specificare ulteriori attributi per definire alcune caratteristiche che deve avere il campo associato del database (ad esempio per una string è possibile specificare la lunghezza del campo VARCHAR associato. Questa funzionalità risulta estremamente utile in fase di sviluppo. Dato che il tipo di database sottostante può essere cambiato senza problemi, è possibile utilizzare, in fase di debug o per i test unitari, delle implementazioni leggere di database (ad esempio HSQL che può essere creato anche in memoria). Ogni volta che si esegue il test hibernate crea il database da zero, senza bisogno di mantenere allineato a mano il modello di dominio e lo schema del DB.

25 5 Persistenza con Hibernate

26 Hibernate Persistence Manager La persistenza in Hibernate si ottiene tramite il Persistence Manager. Tramite il Persistence Manager gli oggetti Java possono essere salvati, trovati ed eliminati dal database. Esso controlla pure le transazioni del database e degli aspetti di cache degli oggetti persistenti. In Hibernate il Persistence Manager è implementato da un'oggetto di tipo Session. 5.2 Perisitence lifecycle Un oggetto Java non è reso persistente nel momento in cui viene istanziato. Un oggetto inizialmente non è associato al database e il suo stato si dice essere transient. Nel momento in cui l'oggetto è collegato al Persistence Manager allora si dice che è persistent. Ci sono due modi per rendere persistente un oggetto: chiamare il metodo save della Session di Hibernate o recuperare un'istanza dal database tramite le funzioni di ricerca del Persistence Manager. Una volta che un oggetto è persitente, ogni cambiamento al suo stato viene propagato anche al database. In realtà queste modifiche nei record del database avvengono solo in determinati momenti stabiliti da Hibernate stesso. Questa caratteristica prende il nome di transparent transaction-level-write-behind, ossia Hibernate propaga le modifiche il più tardi possibile, ma nasconde i dettagli all'applicazione. Se la sessione a cui è associato un oggetto persistente viene chiusa (eseguendo il commit delle operazioni) o se l'oggetto viene sganciato dal Persistence Manager tramite appositi metodi di Session, l'oggetto entra nello stato detached. Un oggetto detached è sempre associato al database (il suo id non è nullo) ma le modifiche effettuate sull'oggetto non vengono propagate al database. Un oggetto detached può tornare ad essere persistente, riagganciando l'oggetto alla sessione tramite appositi metodi. Quando un oggetto persistente viene cancellato, esso viene rimosso dal database e il suo stato torna ad essere transiente. 5.3 Identità degli oggetti Per chiarire uno dei punti che fanno parte del paradigm mismatch, ossia il problema dell'identità, è interessante analizzare come Hibernate gestisca le istanze persistenti. Prima di affrontare la questione, è importante tenere presente la differenza che c'è tra database identity ( a.getid().equals(b.getid()) ) e object identity.( a == b ). In Hibernate vale il seguente principio: All'interno di una Session di Hibernate esiste una sola istanza di oggetto che rappresenta una particolare riga di una tabella del database Questo principio, comunemente detto transaction-scoped identity, ci garantisce che se richiediamo due volte lo stesso record del database otteniamo sempre la stessa istanza di oggetto Java. Quindi nell'ambito dello stesso persistence manager la database identity equivale alla object identity.

27 27 Capitolo 5 Persistenza con Hibernate 5.4 Persistence Manager In questo paragrafo vengono presentati alcuni esempi di utilizzo della Session di Hibernate per rendere persistent, detached e transient alcuni oggetti Java. Per l'esempio prendiamo la classe User definita nel Listato 3.1: La classe User. Listato 5.1: Oggetti persistenti User user = new User( Franco, Rossi ); Session session = getsessionfactory().opensession(); Transaction tx = session.begintransaction(); session.save( user ); tx.commit(); session.close(); L'oggetto user viene creato e attaccato alla Session di Hibernate tramite il metodo save, passando in questo modo allo stato persistent. Questo produce, ad un certo momento, un insert di un nuovo record nella tabella USERS. Conclusa la transazione la sessione viene chiusa e l'oggetto diventa detached. Se la sessione non viene chiusa, l'oggetto rimane nello stato persistent ed è quindi possibile modificarlo ulteriormente. Le modifiche verranno rese persistenti alla fine di una nuova transazione: Listato 5.2: Modifiche ad un oggetto persistente User user = new User( Franco, Rossi ); Session session = getsessionfactory().opensession(); Transaction tx = session.begintransaction(); session.save( user ); tx.commit(); //Si termina la prima transazione ma non si chiude la sessione //Si riapre poi una nuova transazione. //In realta' non e' necessario aprire la sessione prima delle modifiche all'oggetto. tx = session.begintransaction(); user.setname( Gianni ); tx.commit(); session.close(); Come si vede dall'esempio, se un oggetto rimane attaccato alla sessione (persistent) viene automaticamente sincronizzato col database ogni volta che si esegue un commit di una transazione. Hibernate mette a disposizione un'insieme di metodi per gestire lo stato persistente degli oggetti: è possibile attaccare un oggetto detached alla sessione, obbligando a sincronizzare eventualmente le modifiche, oppure rileggendo lo stato attuale da database. È possibile eliminare un oggetto dalla sessione senza eliminarlo dal database. È possibile caricare un oggetto richiedendo un lock di sola lettura o lettura-scrittura. 5.5 Persistenza transitiva Un'altra caratteristica interessante di Hibernate è quella della persistenza transitiva. La persistenza transitiva permette di rendere persistenti non solo gli oggetti che manualmente

28 Hibernate 28 attacchiamo alla sessione, ma pure tutti gli oggetti che in qualche modo sono raggiungibili da esso. In pratica possiamo decidere se, una volta reso persistente un oggetto, tutti gli oggetti referenziati dall'oggetto debbano essere persistenti, anche ricorsivamente. Questo meccanismo risulta molto utile poiché lo sviluppatore non deve più preoccuparsi di salvare ogni oggetto o eseguire i singoli update. Quando un'applicazione interagisce con un oggetto, può modificarlo, aggiungere elementi ad una sua proprietà di tipo collezione o cambiare il riferimento ad un entità, modificare lo stato o cambiare uno qualsiasi di questi oggetti correlati; quando verrà eseguito il commit della transazione, ogni modifica, inserimento o cancellazione a tutto il grafo di elementi sarà eseguita in automatico. La politica di persistenza transitiva (indicata in Hibernate col termine cascade) può essere specificata per ogni attributo della classe all'interno del file di mapping, dando allo sviluppatore un controllo fine sul modo con cui essa opera. Listato 5.3: Department.hbm.xml con l'attributo cascade <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " <hibernate-mapping package="domain"> <class name="department" table="departments" > <id name="id" column="id" type="long"> <generator class="native" /> </id> <property name="name" column="name" type="string" /> <property name="depcode" column="dep_code" type="integer" /> <set name="users" table="users" lazy="true" inverse="true" cascade="save-update"> <key column="dep" not-null="true" /> <one-to-many class="user" /> </set> </class> </hibernate-mapping> L'attributo cascade= save-update permette di rendere persistenti tutte le aggiunte di elementi o le modifiche agli elementi della collezione.

29 6 Interrogazioni con Hibernate

30 Hibernate Recuperare oggetti per Id Come è già stato mostrato nei precedenti esempi Hibernate è in grado di recuperare oggetti da un database utilizzando semplici metodi di Session. Se vogliamo ottenere un'istanza persistente dato l'id del record è sufficiente utilizzare il metodo get: Listato 6.1: Recuperare un oggetto per id Session session = getsessionprovider().opensession(); Transaction tx = session.begintransaction(); User user = session.get( User.class, new Long( 12 ) ); tx.commit(); session.close(); 6.2 Interrogazioni con HQL Ovviamente il metodo mostrato al paragrafo precedente non è sufficiente. Hibernate mette a disposizione un vero e proprio linguaggio simil-sql, l'hql (Hibernate Query Language), che permette di interrogare il database utilizzando le classi Java e le proprietà della classe al posto delle tabelle e dei campi. L'esempio che segue mostra come creare un'interrogazione che cerca tra gli utenti quelli che hanno nome Mario : Listato 6.2: HQL per un interrogazione semplice Session session = getsessionprovider().opensession(); Transaction tx = session.begintransaction(); Query q = session.createquery( select u from User u where u.name = :fname ); q.setstring( fname, Mario ); List<User> users = q.list(); tx.commit(); session.close(); Si nota subito l'assoluta somiglianza con SQL, ma User e u.name rappresentano la classe User e il suo attributo name. Un aspetto interessante che rende più semplice HQL dell'sql standard è il fatto che le join con Hibernate sono implicitamente scritte nel mapping e nel modello di dominio. Normalmente, a differenza di SQL, con HQL non è necessario scrivere join per ottenere le entità associate ad User. Se ad esempio riprendiamo la classe User del Listato 4.2: La classe User modificata, non è necessario mettere in join la classe Department nella query di interrogazione scritta sopra. Infatti, a seconda della politica di cascade dell'associazione, nel momento in cui viene inizializzato un oggetto di tipo User, l'associazione a Department viene o inizializzata o rimpiazzata con un proxy che inizializza l'associazione al suo primo accesso. Se invece abbiamo bisogno di eseguire un'interrogazione che ponga dei criteri anche sulla classe Department, è sufficiente includere nella where la proprietà di department deferenziandola col nome dell'attributo department:

31 31 Capitolo 6 Interrogazioni con Hibernate Listato 6.3: Query con join implicita Query q = session.createquery( select u from User u where u.name=:fusername and u.department.name=:fdepname ); q.setstring( fusername, Mario ); q.setstring( fdepname, My department ); List<User> users = q.list(); Da notare che nella query non è stata scritta alcuna join. Hibernate sa che per ottenere una where sul nome del dipartimento deve eseguire una join SQL, ma questo rimane trasparente allo sviluppatore che ha scritto l'hql. Con HQL è anche possibile eseguire join esplicite e select multiple. Anche in questo caso la sintassi HQL è molto più semplice e compatta di SQL: Listato 6.4: Query con join esplicita Query q = session.createquery( select u, d from User u, u.department d + where u.name=:fusername and d.name=:fdepname ); q.setstring( fusername, Mario ); q.setstring( fdepname, My department ); List<User> users = q.list(); In questo caso la join è ottenuta da u.department grazie al fatto che Hibernate conosce già l'associazione, grazie alla presenza dei file di mapping. Gli elementi della lista risultante da questa interrogazione sono array bidimensionali contenenti le istanze dei due oggetti richiesti.

32 7 Un esempio pratico

33 33 Capitolo 7 Un esempio pratico In questo capitolo viene presentato un esempio pratico di utilizzo di Hibernate. L'esempio è minimale, non si concentra assolutamente sulla presentazione dei dati o sulla loro immissione, bensì sull'utilizzo basilare di Hibernate. Per questo motivo, il database utilizzato per l'esempio è HSQLDB, un database leggero che può essere creato in memoria e che quindi non richiede alcuna installazione. Ovviamente per questo esempio può essere utilizzato un qualsiasi altro database supportato da Hibernate, modificando la configurazione della SessionFactory e aggiungendo la libreria-driver per l'accesso al particolare DB. L'esempio viene costruito facendo uso dell'ambiente di sviluppo open-source Eclipse ( 7.1 Installazione dei prerequisiti Java Nel sistema deve essere installata una versione della JDK di Java. Si consiglia l'ultima versione della Java 6. Per scaricare e installare una JDK consultare il seguente sito: Eclipse Eseguire il download dell'ultima versione di Eclipse dal sito facendo attenzione di prendere quella per il proprio sistema operativo (esistono versioni per Windows, Mac e Linux). Tra le versioni presenti è sufficiente scaricare Eclipse IDE for Java Developers. Scompattare l'archivio scaricato in una qualsiasi cartella. Lanciare Eclipse dall'eseguibile presente nella cartella scompattata Hibernate Scaricare l'ultima versione di Hibernate distribution dal sito (al tempo di questo documento è la versione 3.6.0). Scompattare l'archivio in una qualsiasi cartella HSQLDB Scaricare l'ultima versione del database dal sito Scompattare l'archivio in una qualsiasi cartella.

34 Hibernate Creazione di un nuovo progetto Da dentro Eclipse eseguire il comando File-New-Java project. Impostare Hibernate Test come nome del progetto e cliccare su Finish. Nella finestra Package Explorer che dovrebbe comparire sulla sinistra selezionare col destro il nome del progetto e aggiungere una nuova cartella chiamata lib tramite il comando New-Folder. Aprire un browser del file system, entrare nella cartella in cui è stato scompattato Hibernate, selezionare il file hibernate3.jar e copiarlo nella cartella lib del progetto appena creata (il copy-paste funziona tranquillamente tra browser ed Eclipse). Entrare nella cartella lib della distribuzione Hibernate, poi nella sottocartella required, selezionare tutti i file in essa contenuta e copiarli nella cartella lib del progetto. Entrare nella cartella lib della distribuzione Hibernate, poi nella sottocartella jpa della distribuzione Hibernate e copiare il file contenuto nella cartella lib del progetto. Entrare nella cartella dove è stato scompattato HSQLDB, entrare nella sottocartella lib e copiare il file hsqldb.jar nella cartella lib del progetto. Infine, selezionare tutti i file contenuti nella cartella lib del progetto, cliccare col destro e eseguire il comando Build path-add to build path.

35 35 Capitolo 7 Un esempio pratico Con questa procedura sono state inserite dentro il progetto tutte le librerie necessarie per utilizzare Hibernate e HSQLDB e il progetto è stato configurato per utilizzarle nel proprio class-path. 7.3 Creazione delle classi del dominio Cliccare col destro sulla cartella src del progetto, eseguire il comando New-Class e impostare la classe come nell'immagine che segue: Il nome del package è domain, il nome della classe è User. Il resto della finestra rimane come di default. Cliccando su Finish si ottiene un nuovo file java sotto source. Riempire la classe come segue. package domain; public class User { private Long id; private String name; private String lastname; private Department department; public User() {

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Siti web centrati sui dati Architettura MVC-2: i JavaBeans Siti web centrati sui dati Architettura MVC-2: i JavaBeans 1 ALBERTO BELUSSI ANNO ACCADEMICO 2009/2010 Limiti dell approccio SEVLET UNICA La servlet svolge tre tipi di funzioni distinte: Interazione con

Dettagli

Modulo 4: Ereditarietà, interfacce e clonazione

Modulo 4: Ereditarietà, interfacce e clonazione Modulo 4: Ereditarietà, interfacce e clonazione Argomenti Trattati: Classi, Superclassi e Sottoclassi Ereditarietà Ereditarietà ed Attributi Privati Override super Ereditarietà e Costruttori Polimorfismo

Dettagli

Architettura MVC-2: i JavaBeans

Architettura MVC-2: i JavaBeans Siti web centrati sui dati Architettura MVC-2: i JavaBeans Alberto Belussi anno accademico 2008/2009 Limiti dell approccio SEVLET UNICA La servlet svolge tre tipi di funzioni distinte: Interazione con

Dettagli

Organizzazione degli archivi

Organizzazione degli archivi COSA E UN DATA-BASE (DB)? è l insieme di dati relativo ad un sistema informativo COSA CARATTERIZZA UN DB? la struttura dei dati le relazioni fra i dati I REQUISITI DI UN DB SONO: la ridondanza minima i

Dettagli

Capitolo 13. Interrogare una base di dati

Capitolo 13. Interrogare una base di dati Capitolo 13 Interrogare una base di dati Il database fisico La ridondanza è una cosa molto, molto, molto brutta Non si devono mai replicare informazioni scrivendole in più posti diversi nel database Per

Dettagli

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL Basi di dati Il Linguaggio SQL Data Definition Language (DDL) Data Definition Language: insieme di istruzioni utilizzate per modificare la struttura della base di dati Ne fanno parte le istruzioni di inserimento,

Dettagli

Il database management system Access

Il database management system Access Il database management system Access Corso di autoistruzione http://www.manualipc.it/manuali/ corso/manuali.php? idcap=00&idman=17&size=12&sid= INTRODUZIONE Il concetto di base di dati, database o archivio

Dettagli

HBase Data Model. in più : le colonne sono raccolte in gruppi di colonne detti Column Family; Cosa cambia dunque?

HBase Data Model. in più : le colonne sono raccolte in gruppi di colonne detti Column Family; Cosa cambia dunque? NOSQL Data Model HBase si ispira a BigTable di Google e perciò rientra nella categoria dei column store; tuttavia da un punto di vista logico i dati sono ancora organizzati in forma di tabelle, in cui

Dettagli

Definizione di domini

Definizione di domini Definizione di domini Come nei linguaggi ad alto livello (es. C) è possibile definire nuovi domini (tipi di dati) a partire da quelli predefiniti, anche se il costruttore è più limitato. create domain

Dettagli

Concetti fondamentali dei database database Cos'è un database Principali database

Concetti fondamentali dei database database Cos'è un database Principali database Concetti fondamentali dei database Nella vita di tutti i giorni si ha la necessità di gestire e manipolare dati. Le operazioni possono essere molteplici: ricerca, aggregazione con altri e riorganizzazione

Dettagli

Tale attività non è descritta in questa dispensa

Tale attività non è descritta in questa dispensa Fondamenti di informatica Oggetti e Java ottobre 2014 1 Nota preliminare L installazione e l uso di Eclipse richiede di aver preliminarmente installato Java SE SDK Tale attività non è descritta in questa

Dettagli

Mappare il DB senza XML. Introduzione alle annotation di Hibernate3

Mappare il DB senza XML. Introduzione alle annotation di Hibernate3 Introduzione alle annotation di Hibernate3 a cura di Lucio Benfante Hibernate Hibernate è un framework che realizza un object/relational mapping (ORM) fra oggetti Java e strutture di un database relazionale

Dettagli

Esercizio data base "Biblioteca"

Esercizio data base Biblioteca Rocco Sergi Esercizio data base "Biblioteca" Database 2: Biblioteca Testo dell esercizio Si vuole realizzare una base dati per la gestione di una biblioteca. La base dati conterrà tutte le informazioni

Dettagli

Manuale Utente Albo Pretorio GA

Manuale Utente Albo Pretorio GA Manuale Utente Albo Pretorio GA IDENTIFICATIVO DOCUMENTO MU_ALBOPRETORIO-GA_1.4 Versione 1.4 Data edizione 04.04.2013 1 TABELLA DELLE VERSIONI Versione Data Paragrafo Descrizione delle modifiche apportate

Dettagli

Rappresentazione grafica di entità e attributi

Rappresentazione grafica di entità e attributi PROGETTAZIONE CONCETTUALE La progettazione concettuale, ha il compito di costruire e definire una rappresentazione corretta e completa della realtà di interesse, e il prodotto di tale attività, è lo schema

Dettagli

Dispensa di database Access

Dispensa di database Access Dispensa di database Access Indice: Database come tabelle; fogli di lavoro e tabelle...2 Database con più tabelle; relazioni tra tabelle...2 Motore di database, complessità di un database; concetto di

Dettagli

Programmazione Java Avanzata Spring - JDBC

Programmazione Java Avanzata Spring - JDBC Programmazione Java Avanzata Spring - JDBC Ing. Gianluca Caminiti Riferimenti Spring http://www.springsource.org/ (scaricate il reference) Beginning Spring 2 - From Novice to Professional. APress. 2008

Dettagli

FOXWave 1.0.0 Gestione gare ARDF IZ1FAL Secco Marco Sezione ARI BIELLA

FOXWave 1.0.0 Gestione gare ARDF IZ1FAL Secco Marco Sezione ARI BIELLA FOXWave 1.0.0 Gestione gare ARDF IZ1FAL Secco Marco Sezione ARI BIELLA Redatto da IZ1FAL Secco Marco Pagina 1 di 15 INDICE 1 1- INSTALLAZIONE... 3 1-1 Scaricare i pacchetti aggiornati... 3 1-2 Startup

Dettagli

Mon Ami 3000 Varianti articolo Gestione di varianti articoli

Mon Ami 3000 Varianti articolo Gestione di varianti articoli Prerequisiti Mon Ami 3000 Varianti articolo Gestione di varianti articoli L opzione Varianti articolo è disponibile per le versioni Azienda Light e Azienda Pro e include tre funzionalità distinte: 1. Gestione

Dettagli

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7. Il trattamento dei dati

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7. Il trattamento dei dati Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7 Il trattamento dei dati database: il linguaggio SQL seconda parte Prof. Valle D.ssa Folgieri Lez9 15.11.06 Trattamento dati. Database: il

Dettagli

FIRESHOP.NET. Utilizzare il FireSoft. Rev. 2014.3.1 www.firesoft.it

FIRESHOP.NET. Utilizzare il FireSoft. Rev. 2014.3.1 www.firesoft.it FIRESHOP.NET Utilizzare il FireSoft Admin Rev. 2014.3.1 www.firesoft.it Sommario SOMMARIO Introduzione... 3 Il FireSoft NET Admin... 4 Verificare la connessione al database.... 4 Svuotare i log... 5 Compatta

Dettagli

Come modificare la propria Home Page e gli elementi correlati

Come modificare la propria Home Page e gli elementi correlati Come modificare la propria Home Page e gli elementi correlati Versione del documento: 3.0 Ultimo aggiornamento: 2006-09-15 Riferimento: webmaster (webmaster.economia@unimi.it) La modifica delle informazioni

Dettagli

PULSANTI E PAGINE Sommario PULSANTI E PAGINE...1

PULSANTI E PAGINE Sommario PULSANTI E PAGINE...1 Pagina 1 Sommario...1 Apertura...2 Visualizzazioni...2 Elenco...2 Testo sul pulsante e altre informazioni...3 Comandi...3 Informazioni...4 Flow chart...5 Comandi...6 Pulsanti Principali e Pulsanti Dipendenti...6

Dettagli

Al giorno d oggi, i sistemi per la gestione di database

Al giorno d oggi, i sistemi per la gestione di database Introduzione Al giorno d oggi, i sistemi per la gestione di database implementano un linguaggio standard chiamato SQL (Structured Query Language). Fra le altre cose, il linguaggio SQL consente di prelevare,

Dettagli

ATOLLO BACKUP GUIDA INSTALLAZIONE E CONFIGURAZIONE

ATOLLO BACKUP GUIDA INSTALLAZIONE E CONFIGURAZIONE ATOLLO BACKUP GUIDA INSTALLAZIONE E CONFIGURAZIONE PREMESSA La presente guida è da considerarsi come aiuto per l utente per l installazione e configurazione di Atollo Backup. La guida non vuole approfondire

Dettagli

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste versione 2.1 24/09/2015 aggiornamenti: 23-set-2015; 24-set-2015 Autore: Francesco Brunetta (http://www.francescobrunetta.it/)

Dettagli

Funzioni non documentate Openoffice.org. 3 Base mini-howto

Funzioni non documentate Openoffice.org. 3 Base mini-howto Funzioni non documentate Openoffice.org. 3 Base mini-howto Augusto Scatolini (webmaster@comunecampagnano.it) Ver. 1.0 gennaio 2009 Come risolvere il problema del contatore che inizia da 0 (zero) Come importare

Dettagli

Esercitazione 4 JDBC

Esercitazione 4 JDBC JDBC Obiettivi dell esercitazione Familiarizzare con l'organizzazione dell'ambiente di lavoro per la realizzazione di applicazioni Java Utilizzare i costrutti di base della libreria JDBC per 1. la gestione

Dettagli

Corso su LINQ Lezione 16. Introduzione

Corso su LINQ Lezione 16. Introduzione LINQ to SQL Introduzione Con questa lezione introduciamo il flavor LINQ to SQL. Dopo aver visto quindi tutte le funzionalità e gli operatori di LINQ to Object, affronteremo ora la tematica riguardante

Dettagli

1. BASI DI DATI: GENERALITÀ

1. BASI DI DATI: GENERALITÀ 1. BASI DI DATI: GENERALITÀ BASE DI DATI (DATABASE, DB) Raccolta di informazioni o dati strutturati, correlati tra loro in modo da risultare fruibili in maniera ottimale. Una base di dati è usualmente

Dettagli

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti Capitolo 3 L applicazione Java Diagrammi ER Dopo le fasi di analisi, progettazione ed implementazione il software è stato compilato ed ora è pronto all uso; in questo capitolo mostreremo passo passo tutta

Dettagli

Informatica Generale Andrea Corradini. 19 - Sistemi di Gestione delle Basi di Dati

Informatica Generale Andrea Corradini. 19 - Sistemi di Gestione delle Basi di Dati Informatica Generale Andrea Corradini 19 - Sistemi di Gestione delle Basi di Dati Sommario Concetti base di Basi di Dati Il modello relazionale Relazioni e operazioni su relazioni Il linguaggio SQL Integrità

Dettagli

Sistemi Mobili e Wireless Android - Dati persistenti: SQLite

Sistemi Mobili e Wireless Android - Dati persistenti: SQLite Sistemi Mobili e Wireless Android - Dati persistenti: SQLite Stefano Burigat Dipartimento di Matematica e Informatica Università di Udine www.dimi.uniud.it/burigat stefano.burigat@uniud.it Android offre

Dettagli

LUdeS Informatica 2 EXCEL. Seconda parte AA 2013/2014

LUdeS Informatica 2 EXCEL. Seconda parte AA 2013/2014 LUdeS Informatica 2 EXCEL Seconda parte AA 2013/2014 STAMPA Quando si esegue il comando FILE STAMPA, Excel manda alla stampante tutte le celle del foglio di lavoro corrente che hanno un contenuto. Il numero

Dettagli

I MODULI Q.A.T. PANORAMICA. La soluzione modulare di gestione del Sistema Qualità Aziendale

I MODULI Q.A.T. PANORAMICA. La soluzione modulare di gestione del Sistema Qualità Aziendale La soluzione modulare di gestione del Sistema Qualità Aziendale I MODULI Q.A.T. - Gestione clienti / fornitori - Gestione strumenti di misura - Gestione verifiche ispettive - Gestione documentazione del

Dettagli

Database 1 biblioteca universitaria. Testo del quesito

Database 1 biblioteca universitaria. Testo del quesito Database 1 biblioteca universitaria Testo del quesito Una biblioteca universitaria acquista testi didattici su indicazione dei professori e cura il prestito dei testi agli studenti. La biblioteca vuole

Dettagli

Mon Ami 3000 Conto Lavoro Gestione del C/Lavoro attivo e passivo

Mon Ami 3000 Conto Lavoro Gestione del C/Lavoro attivo e passivo Prerequisiti Mon Ami 3000 Conto Lavoro Gestione del C/Lavoro attivo e passivo L opzione Conto lavoro è disponibile per le versioni Azienda Light e Azienda Pro. Introduzione L opzione Conto lavoro permette

Dettagli

Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass

Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass 0_Iniziare con GRASS Avvio di Grass e creazione della cartella del Database di GRASS Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass

Dettagli

Programmazione a Oggetti Modulo B

Programmazione a Oggetti Modulo B Programmazione a Oggetti Modulo B Progetto Dott. Alessandro Roncato 4/10/2011 Progetto Da svolgere singolarmente Scadenza consegna: una settimana prima dello scritto; Valutazione in base a: Corretta compilazione

Dettagli

DBMS (Data Base Management System)

DBMS (Data Base Management System) Cos'è un Database I database o banche dati o base dati sono collezioni di dati, tra loro correlati, utilizzati per rappresentare una porzione del mondo reale. Sono strutturati in modo tale da consentire

Dettagli

Guida Software GestioneSpiaggia.it

Guida Software GestioneSpiaggia.it Caratteristiche Guida Software GestioneSpiaggia.it 1. Gestione prenotazioni articoli (ombrellone, cabina, ecc ) ed attrezzature (sdraio, lettino ecc ) 2. Visualizzazione grafica degli affitti sia giornaliera

Dettagli

Introduzione alla consultazione dei log tramite IceWarp Log Analyzer

Introduzione alla consultazione dei log tramite IceWarp Log Analyzer Introduzione alla consultazione dei log tramite IceWarp Log Analyzer L Analizzatore di Log è uno strumento che consente un'analisi statistica e logica dei file di log generati dal server. Lo strumento

Dettagli

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

Data Base. Master Bio Info Reti e Basi di Dati Lezione 6 Data Base 1 Sommario I concetti fondamentali. Database Relazionale.. Query e SQL MySql, Creazione di un db in MySQL con PHPmyAdmin Creazione database e delle Tabelle Query Inserimento Ricerca Modifica

Dettagli

Università degli Studi di Bologna Facoltà di Ingegneria. Tecnologie Web L-A A.A. 2014 2015. Esercitazione 08 DAO e Hibernate

Università degli Studi di Bologna Facoltà di Ingegneria. Tecnologie Web L-A A.A. 2014 2015. Esercitazione 08 DAO e Hibernate Università degli Studi di Bologna Facoltà di Ingegneria Tecnologie Web L-A A.A. 2014 2015 Esercitazione 08 DAO e Hibernate Agenda Pattern DAO e framework Hibernate progetto d'esempio relativo alla gestione

Dettagli

Introduzione al mondo della persistenza. Dott. Doria Mauro doriamauro@gmail.com

Introduzione al mondo della persistenza. Dott. Doria Mauro doriamauro@gmail.com Hibernate Introduzione al mondo della persistenza Dott. Doria Mauro doriamauro@gmail.com La questione della persistenza Il modo dei database è complesso e le tecniche e le tecnologie sono molte. Per anni

Dettagli

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008. Esercitazione. Programmazione Object Oriented in Java

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008. Esercitazione. Programmazione Object Oriented in Java Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008 Alessandro Longheu http://www.diit.unict.it/users/alongheu alessandro.longheu@diit.unict.it Programmazione Object Oriented in Java

Dettagli

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino Integration Services Project SQL Server 2005 Integration Services Permette di gestire tutti i processi di ETL Basato sui progetti di Business Intelligence di tipo Integration services Project SQL Server

Dettagli

Introduzione ai database relazionali

Introduzione ai database relazionali Introduzione ai database relazionali Tabelle Un database (DB) è costituito da un insieme di file che memorizzano dati opportunamente organizzati Nei database relazionale tale organizzazione è costituita

Dettagli

Configurazione di base. Dott. Doria Mauro doriamauro@gmail.com

Configurazione di base. Dott. Doria Mauro doriamauro@gmail.com Hibernate Configurazione di base Dott. Doria Mauro doriamauro@gmail.com I file di configurazione Hibernate prevede l uso dei file di configurazione formato XML. I principali file sono: Un file di configurazione

Dettagli

Guida all installazione di Easy

Guida all installazione di Easy Guida all installazione di Easy ISTRUZIONI PER L INSTALLAZIONE DEL SOFTWARE EASY Requisiti di sistema Sistemi operativi supportati: Windows 2000 Service Pack 4; Windows Server 2003 SP2(consigliato per

Dettagli

Lezioni di Laboratorio sui Data Base

Lezioni di Laboratorio sui Data Base Lezioni di Laboratorio sui Data Base Docente Tutor: Dott. Gianluigi Roveda Informatica per l'impresa Prima Parte: Open Office - Base PREMESSA Questo lavoro è stato realizzato a partire dalle slides del

Dettagli

Guida all uso di Java Diagrammi ER

Guida all uso di Java Diagrammi ER Guida all uso di Java Diagrammi ER Ver. 1.1 Alessandro Ballini 16/5/2004 Questa guida ha lo scopo di mostrare gli aspetti fondamentali dell utilizzo dell applicazione Java Diagrammi ER. Inizieremo con

Dettagli

GERARCHIE RICORSIVE - SQL SERVER 2008

GERARCHIE RICORSIVE - SQL SERVER 2008 GERARCHIE RICORSIVE - SQL SERVER 2008 DISPENSE http://dbgroup.unimo.it/sia/gerarchiericorsive/ L obiettivo è quello di realizzare la tabella di navigazione tramite una query ricorsiva utilizzando SQL SERVER

Dettagli

Visual basic base Lezione 01. L'ambiente di sviluppo

Visual basic base Lezione 01. L'ambiente di sviluppo L'ambiente di sviluppo L'ambiente di sviluppo Visual basic è un linguaggio di programmazione Microsoft. In questo corso prenderemo in considerazione, l'ultima versione. net di questo linguaggio. Microsoft

Dettagli

I database relazionali sono il tipo di database attualmente piu diffuso. I motivi di questo successo sono fondamentalmente due:

I database relazionali sono il tipo di database attualmente piu diffuso. I motivi di questo successo sono fondamentalmente due: Il modello relazionale I database relazionali sono il tipo di database attualmente piu diffuso. I motivi di questo successo sono fondamentalmente due: 1. forniscono sistemi semplici ed efficienti per rappresentare

Dettagli

Il calendario di Windows Vista

Il calendario di Windows Vista Il calendario di Windows Vista Una delle novità introdotte in Windows Vista è il Calendario di Windows, un programma utilissimo per la gestione degli appuntamenti, delle ricorrenze e delle attività lavorative

Dettagli

Registratori di Cassa

Registratori di Cassa modulo Registratori di Cassa Interfacciamento con Registratore di Cassa RCH Nucleo@light GDO BREVE GUIDA ( su logiche di funzionamento e modalità d uso ) www.impresa24.ilsole24ore.com 1 Sommario Introduzione...

Dettagli

Il software ideale per la gestione delle prenotazioni GUIDA UTENTE

Il software ideale per la gestione delle prenotazioni GUIDA UTENTE Il software ideale per la gestione delle prenotazioni GUIDA UTENTE Presentazione... 2 Installazione... 3 Prima esecuzione... 6 Registrazione del programma... 8 Inserimento Immobile... 9 Inserimento proprietario...

Dettagli

Soluzione dell esercizio del 2 Febbraio 2004

Soluzione dell esercizio del 2 Febbraio 2004 Soluzione dell esercizio del 2 Febbraio 2004 1. Casi d uso I casi d uso sono riportati in Figura 1. Figura 1: Diagramma dei casi d uso. E evidenziato un sotto caso di uso. 2. Modello concettuale Osserviamo

Dettagli

CORSO ACCESS PARTE II. Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?)

CORSO ACCESS PARTE II. Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?) Ambiente Access La Guida di Access Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?) Guida in linea Guida rapida Assistente di Office indicazioni

Dettagli

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0 11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0 PAG. 2 DI 38 INDICE 1. PREMESSA 3 2. SCARICO DEL SOFTWARE 4 2.1 AMBIENTE WINDOWS 5 2.2 AMBIENTE MACINTOSH 6 2.3 AMBIENTE

Dettagli

MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE

MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE 1/6 MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE Per prima cosa si ringrazia per aver scelto ImmobiPhone e per aver dato fiducia al suo autore. Il presente documento istruisce l'utilizzatore sull'uso del programma

Dettagli

CONFIGURAZIONE E GESTIONE DEI DATABASE (rev. 1.1)

CONFIGURAZIONE E GESTIONE DEI DATABASE (rev. 1.1) CONFIGURAZIONE E GESTIONE DEI DATABASE (rev. 1.1) Indice. Introduzione Configurazione iniziale del database Condivisione del database su rete locale (LAN) Cambio e gestione di database multipli Importazione

Dettagli

Progettazione della componente applicativa

Progettazione della componente applicativa 7 Progettazione della componente applicativa In questo capitolo illustreremo la progettazione della componente applicativa di un sistema informativo. La metodologia da noi utilizzata sarà basata sull utilizzo

Dettagli

MySQL Database Management System

MySQL Database Management System MySQL Database Management System http://www.mysql.com/ DATABASE RELAZIONALI Un database è una collezione strutturata di informazioni. I database sono delle strutture nelle quali è possibile memorizzare

Dettagli

MANUALE PARCELLA FACILE PLUS INDICE

MANUALE PARCELLA FACILE PLUS INDICE MANUALE PARCELLA FACILE PLUS INDICE Gestione Archivi 2 Configurazioni iniziali 3 Anagrafiche 4 Creazione prestazioni e distinta base 7 Documenti 9 Agenda lavori 12 Statistiche 13 GESTIONE ARCHIVI Nella

Dettagli

WG-TRANSLATE Manuale Utente WG TRANSLATE. Pagina 1 di 15

WG-TRANSLATE Manuale Utente WG TRANSLATE. Pagina 1 di 15 WG TRANSLATE Pagina 1 di 15 Sommario WG TRANSLATE... 1 1.1 INTRODUZIONE... 3 1 TRADUZIONE DISPLAY FILE... 3 1.1 Traduzione singolo display file... 4 1.2 Traduzione stringhe da display file... 5 1.3 Traduzione

Dettagli

5.3 TABELLE 5.3.1 RECORD 5.3.1.1 Inserire, eliminare record in una tabella Aggiungere record Eliminare record

5.3 TABELLE 5.3.1 RECORD 5.3.1.1 Inserire, eliminare record in una tabella Aggiungere record Eliminare record 5.3 TABELLE In un sistema di database relazionali le tabelle rappresentano la struttura di partenza, che resta poi fondamentale per tutte le fasi del lavoro di creazione e di gestione del database. 5.3.1

Dettagli

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione SQL DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE SQL è più di un semplice linguaggio di interrogazione! Linguaggio di definizione dati (Data-definition language, DDL):! Crea/distrugge/modifica relazioni

Dettagli

Operazioni sui database

Operazioni sui database Operazioni sui database Le operazioni nel modello relazionale sono essenzialmente di due tipi: Operazioni di modifica della base di dati (update) Interrogazioni della base di dati per il recupero delle

Dettagli

Guida alla registrazione on-line di un DataLogger

Guida alla registrazione on-line di un DataLogger NovaProject s.r.l. Guida alla registrazione on-line di un DataLogger Revisione 3.0 3/08/2010 Partita IVA / Codice Fiscale: 03034090542 pag. 1 di 17 Contenuti Il presente documento è una guida all accesso

Dettagli

lo 2 2-1 - PERSONALIZZARE LA FINESTRA DI WORD 2000

lo 2 2-1 - PERSONALIZZARE LA FINESTRA DI WORD 2000 Capittol lo 2 Visualizzazione 2-1 - PERSONALIZZARE LA FINESTRA DI WORD 2000 Nel primo capitolo sono state analizzate le diverse componenti della finestra di Word 2000: barra del titolo, barra dei menu,

Dettagli

Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci

Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci Corso di Laurea Magistrale in Ingegneria per l Ambiente e il Territorio A.A. 2014-2015 Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci Strutture di dati: DB e DBMS DATO E INFORMAZIONE Dato: insieme

Dettagli

Corso di Amministrazione di Reti A.A. 2002/2003

Corso di Amministrazione di Reti A.A. 2002/2003 Struttura di Active Directory Corso di Amministrazione di Reti A.A. 2002/2003 Materiale preparato utilizzando dove possibile materiale AIPA http://www.aipa.it/attivita[2/formazione[6/corsi[2/materiali/reti%20di%20calcolatori/welcome.htm

Dettagli

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da ARPA Fonte Dati Regione Toscana Redatto da L. Folchi (TAI) Rivisto da Approvato da Versione 1.0 Data emissione 06/08/13 Stato DRAFT 1 Versione Data Descrizione 1,0 06/08/13 Versione Iniziale 2 Sommario

Dettagli

Introduzione alla teoria dei database relazionali. Come progettare un database

Introduzione alla teoria dei database relazionali. Come progettare un database Introduzione alla teoria dei database relazionali Come progettare un database La struttura delle relazioni Dopo la prima fase di individuazione concettuale delle entità e degli attributi è necessario passare

Dettagli

Manuale Amministratore Legalmail Enterprise. Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise

Manuale Amministratore Legalmail Enterprise. Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise Manuale Amministratore Legalmail Enterprise Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise Pagina 2 di 16 Manuale Amministratore Legalmail Enterprise Introduzione a Legalmail Enterprise...3

Dettagli

MANUALE UTENTE Fiscali Free

MANUALE UTENTE Fiscali Free MANUALE UTENTE Fiscali Free Le informazioni contenute in questa pubblicazione sono soggette a modifiche da parte della ComputerNetRimini. Il software descritto in questa pubblicazione viene rilasciato

Dettagli

Access. P a r t e p r i m a

Access. P a r t e p r i m a Access P a r t e p r i m a 1 Esempio di gestione di database con MS Access 2 Cosa è Access? Access e un DBMS che permette di progettare e utilizzare DB relazionali Un DB Access e basato sui concetti di

Dettagli

Le Basi di Dati. Le Basi di Dati

Le Basi di Dati. Le Basi di Dati Le Basi di Dati 20/05/02 Prof. Carlo Blundo 1 Le Basi di Dati Le Base di Dati (database) sono un insieme di tabelle di dati strutturate in maniera da favorire la ricerca di informazioni specializzate per

Dettagli

File, Modifica, Visualizza, Strumenti, Messaggio

File, Modifica, Visualizza, Strumenti, Messaggio Guida installare account in Outlook Express Introduzione Questa guida riguarda di sicuro uno dei programmi maggiormente usati oggi: il client di posta elettronica. Tutti, ormai, siamo abituati a ricevere

Dettagli

Strumenti di modellazione. Gabriella Trucco

Strumenti di modellazione. Gabriella Trucco Strumenti di modellazione Gabriella Trucco Linguaggio di modellazione Linguaggio formale che può essere utilizzato per descrivere (modellare) un sistema Il concetto trova applicazione soprattutto nell

Dettagli

DESIGN PATTERNS Parte 6. State Proxy

DESIGN PATTERNS Parte 6. State Proxy DESIGN PATTERNS Parte 6 State Proxy STATE Il Design Pattern State nasce dall'esigenza di poter gestire gli stati di una classe senza dover usare dei costrutti come gli Enum e quindi delle switch. Prendiamo

Dettagli

Le query. Lezione 6 a cura di Maria Novella Mosciatti

Le query. Lezione 6 a cura di Maria Novella Mosciatti Lezione 6 a cura di Maria Novella Mosciatti Le query Le query sono oggetti del DB che consentono di visualizzare, modificare e analizzare i dati in modi diversi. Si possono utilizzare query come origine

Dettagli

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) 12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica,

Dettagli

E-mail: infobusiness@zucchetti.it. Gestione Filtri. InfoBusiness 2.8 Gestione Filtri Pag. 1/ 11

E-mail: infobusiness@zucchetti.it. Gestione Filtri. InfoBusiness 2.8 Gestione Filtri Pag. 1/ 11 Gestione Filtri InfoBusiness 2.8 Gestione Filtri Pag. 1/ 11 INDICE Indice...2 1. GESTIONE DEI FILTRI...3 1.1. Filtri fissi...3 1.2. Filtro parametrico...5 1.3. Funzione di ricerca...6 2. CONTESTI IN CUI

Dettagli

Database. Si ringrazia Marco Bertini per le slides

Database. Si ringrazia Marco Bertini per le slides Database Si ringrazia Marco Bertini per le slides Obiettivo Concetti base dati e informazioni cos è un database terminologia Modelli organizzativi flat file database relazionali Principi e linee guida

Dettagli

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS CONTENUTI: CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS Creazione database vuoto Creazione tabella Inserimento dati A) Creazione di un database vuoto Avviamo il programma Microsoft Access. Dal menu

Dettagli

OwnCloud Guida all installazione e all uso

OwnCloud Guida all installazione e all uso INFN Sezione di Perugia Servizio di Calcolo e Reti Fabrizio Gentile OwnCloud Guida all installazione e all uso 1 SOMMARIO 2 Introduzione... 1 2.1 Alcune delle funzioni di OwnCloud... 2 2.2 Chi può usufruirne...

Dettagli

Gestione Risorse Umane Web

Gestione Risorse Umane Web La gestione delle risorse umane Gestione Risorse Umane Web Generazione attestati di partecipazione ai corsi di formazione (Versione V03) Premessa... 2 Configurazione del sistema... 3 Estrattore dati...

Dettagli

Manuale servizio Webmail. Introduzione alle Webmail...2 Webmail classica (SquirrelMail)...3 Webmail nuova (RoundCube)...8

Manuale servizio Webmail. Introduzione alle Webmail...2 Webmail classica (SquirrelMail)...3 Webmail nuova (RoundCube)...8 Manuale servizio Webmail Introduzione alle Webmail...2 Webmail classica (SquirrelMail)...3 Webmail nuova (RoundCube)...8 Introduzione alle Webmail Una Webmail è un sistema molto comodo per consultare la

Dettagli

Excel. A cura di Luigi Labonia. e-mail: luigi.lab@libero.it

Excel. A cura di Luigi Labonia. e-mail: luigi.lab@libero.it Excel A cura di Luigi Labonia e-mail: luigi.lab@libero.it Introduzione Un foglio elettronico è un applicazione comunemente usata per bilanci, previsioni ed altri compiti tipici del campo amministrativo

Dettagli

Raggruppamenti Conti Movimenti

Raggruppamenti Conti Movimenti ESERCITAZIONE PIANO DEI CONTI Vogliamo creare un programma che ci permetta di gestire, in un DB, il Piano dei conti di un azienda. Nel corso della gestione d esercizio, si potranno registrare gli articoli

Dettagli

UNIVERSITA DI FIRENZE Facoltà di Ingegneria. Persistenza Applicazioni Enterprise Uso dei modelli

UNIVERSITA DI FIRENZE Facoltà di Ingegneria. Persistenza Applicazioni Enterprise Uso dei modelli UNIVERSITA DI FIRENZE Facoltà di Ingegneria Persistenza Applicazioni Enterprise Uso dei modelli 1 IL problema della persistenza APPLICAZIONE (programmi) (oggetti) DATI PERSISTENTI (file, record) (basi

Dettagli

Esercizio sui data base "Gestione conti correnti"

Esercizio sui data base Gestione conti correnti Database "Gestione conto correnti" Testo del quesito La banca XYZ vuole informatizzare le procedure di gestione dei conti correnti creando un archivio dei correntisti (Cognome, Nome, indirizzo, telefono,

Dettagli

Come masterizzare dischi con Nero 11

Come masterizzare dischi con Nero 11 Come masterizzare dischi con Nero 11 Non c è dubbio che Nero è diventato un sinonimo di masterizzatore di dischi, data la lunga esperienza sul mercato. Molte persone pensano in questo programma nel momento

Dettagli

Manuale Operativo per l utilizzo della piattaforma E-Learning@AQ. Versione 1.1

Manuale Operativo per l utilizzo della piattaforma E-Learning@AQ. Versione 1.1 Manuale Operativo per l utilizzo della piattaforma E-Learning@AQ Versione 1.1 Autore Antonio Barbieri, antonio.barbieri@gmail.com Data inizio compilazione 11 maggio 2009 Data revisione 14 maggio 2009 Sommario

Dettagli

EasyPrint v4.15. Gadget e calendari. Manuale Utente

EasyPrint v4.15. Gadget e calendari. Manuale Utente EasyPrint v4.15 Gadget e calendari Manuale Utente Lo strumento di impaginazione gadget e calendari consiste in una nuova funzione del software da banco EasyPrint 4 che permette di ordinare in maniera semplice

Dettagli

INDICE. Accesso al Portale Pag. 2. Nuovo preventivo - Ricerca articoli. Pag. 4. Nuovo preventivo Ordine. Pag. 6. Modificare il preventivo. Pag.

INDICE. Accesso al Portale Pag. 2. Nuovo preventivo - Ricerca articoli. Pag. 4. Nuovo preventivo Ordine. Pag. 6. Modificare il preventivo. Pag. Gentile Cliente, benvenuto nel Portale on-line dell Elettrica. Attraverso il nostro Portale potrà: consultare la disponibilità dei prodotti nei nostri magazzini, fare ordini, consultare i suoi prezzi personalizzati,

Dettagli