In questo articolo vogliamo illustrare in maniera semplice come utilizzare Hibernate all'interno degli ambienti Eclipse. In particolare utilizzeremo l'IDE commerciale Myeclipse for Spring 8 (versione trial), che contiene il plugin Hibernate Tools (ovviamente utilizzabile anche nelle versione free di Eclipse, installandolo a mano); abbiamo inoltre scelto di utilizzare come database relazionale MySQL.
Hibernate è un ORM (acronimo di Object Relational Mapping) ed in sostanza fa da ponte tra java e un database mappando ciascun record di quest'ultimo come oggetto Java.
Il nostro obiettivo sarà quindi utilizzare gli oggetti mappati per effettuare le classiche operazioni CRUD (Create Read Update Delete) sul database relegando ad hibernate il compito di
"sincronizzare" lo stato del database in funzione delle operazioni fatte sugli oggetti. Hibernate è un framework che non si lega ad uno specifico database piuttosto permette di specificare sia il dialetto utilizzato sia il tipo di database e vendor oltre che i parametri di collegamento come porta di ascolto, user e password.
Per chi non conoscesse affatto Hibernate rimandiamo all'articolo introduttivo su Hibernate già pubblicato.
Installazione di MySQL
Scarichiamo il pacchetto MySql alla seguente url: http://www.mysql.it/downloads/
Avviandolo, installeremo sia il database MySql che il workbench, che ci consentirà di effettuare delle operazioni DDL e DML (Data description Language e Data Manipulation Language). Avremo cioè sia modo di creare ad esempio uno schema o delle tabelle all'interno del database (quindi operazioni legate alla struttura), sia di effettuare delle query (operazioni legate ai dati contenuti nella struttura).
Installiamo quindi MySql: durante l'installazione verranno chieste diverse cose tra cui la password da utilizzare e se il database è presente sulla stessa macchina utente. A fine installazione lanciamo il workbench, la schermata iniziale sarà la seguente:
MySQL workbench welcome
ì
Cliccando due volte sulla istanza del database server creato inseriremo user e password ed avremo accesso alla schermata successiva se il server MySql è in stato running.
avvio di mysql con mysql workbench
Dobbiamo quindi assicurarci che il server MySql sia in esecuzione, normalmente o il servizio viene avviato all'avvio del sistema operativo oppure basta avviare il MySql workbench e cliccare due volte su open connection
per aprire la connessione verso il database server oppure cliccare due volte su server administration
per avviare il server e successivamente aprire la connessione al database server stesso:
MySQL workbench server administration
MySQL workbench open connection
MySQL workbench startup/shutdown
Configurazione MySQL
Clicchiamo sulla iconcina Home (la casa piccola in alto a sinistra) e andiamo quindi a creare un nuovo schema che chiamiamo mioschema
ed una tabella nello schema che chiamiamo utenti
:
Clicchiamo sull’iconcina in alto a destra per ottenere la visualizzazione visuale dei fields da inserire questo per creare i campi del record in maniera più veloce.
Inserire quindi i campi elencati avendo cura di specificare una primary Key con valore UNIQUE
che specifica l’univocità della chiave ed il valore AI
, che è l'acronimo di AutoIncrement
, lasciando che sia il database a specificare di volta in volta ed in maniera incrementale la chiave di ciascun record:
Una volta cliccato sul tasto apply
ci verrà
mostrato lo script SQL che verrà eseguito per apportare le modifiche richieste, quindi eseguito lo script verrà creata la tabella con i campi definiti.
Ovviamente il workbench ci permette anche di eseguire una query SELECT
per stampare a video il contenuto della tabella che nel nostro caso non è ancora stata popolata:
La parte di sviluppo in Java
Utilizzeremo come IDE MyEclipse, in particolare la versione trial di MyEclipse for Spring che, rispetto all'IDE standard offre dei plugin preinstallati quindi solleva lo sviluppatore dall’onere dell'installazione e configurazione degli stessi.
Assicuriamoci prima di tutto di avere il server MySql in esecuzione come precedentemente descritto, avviamo MyEclipse e creiamo un progetto con nome HibernateFirstProject
, creiamo a livello ROOT una cartella lib
, e memorizziamo al suo interno il jar mysql-connector-java-5.1.18.jar
, che rappresenta il connettore o driver che fa da ponte tra java e MySql server, e quindi con il database.
Connessione al database
Apriamo la prospettiva MyEclipse Database Explorer
:
Ora premendo il tasto destro del mouse nel tab db browser
creiamo un nuovo database connection driver e inseriamo le informazioni che abbiamo precedentemente definito, possiamo quindi testare la connessione per stabilire se funziona correttamente. Da rimarcare che nell'url abbiamo definito come macchina localhost
e come porta di ascolto la 3306
, ma possiamo tranquillamente cambiare entrambi laddove è necessario.
Proseguendo se clicchiamo due volte nel db browser su MySql
(il driver precedentemente creato) potremo esplorare lo schema e le tabelle contenute in esso, ed allo stesso modo editare il contenuto dei records, anche se per il nostro articolo non è strettamente necessario.
La parte di sviluppo in Java
generazione delle classi con hibernate
A questo punto possiamo iniziare ad utilizzare il mapping dal database, generando automaticamente il codice delle classi corrispondenti alle nostre tabelle.
Clicchiamo ora sulla tabella utenti col tasto destro del mouse e scegliamo la voce Myeclipse/add Hibernate
, scegliamo tranquillamente l'ultima versione di Hibernate, e specifichiamo il nostro driver per accedere al database.
Capabilities
Infine possiamo specificare che vogliamo generare la SessionFactory
class (utilizzata per ricavare il contesto transazionale) e il package (hibernate.generated
) dove vogliamo sia memorizzato il cosiddetto artifact code
, cioè il codice generato in maniera automatica.
Ora selezioniamo nuovamente la prospettiva DB BROWSER
e selezioniamo dalla lista la voce Hibernate reverse Engineering
.
Quindi selezioniamo le opzioni come in figura, dove specifichiamo in maniera customizzata gli artifacts da generare:
Il codice generato rientra nella configurazione prevista da Hibernate per il mapping ORM
Il file di configurazione Utenti.hbm.xml
serve per mappare i campi del record su un oggetto Java
(Utenti.java
), mentre Hibernate.cfg.xml
serve per la configurazione della connessione al database.
Aggiungendo hibernate capabilities
MyEclipse vi chiederà se utilizzare il connector nella cartella lib
, oppure quello previsto nella generazione
dell’artifact code. Ovviamente scegliamo il nostro jar perchè lo abbiamo utilizzato per creare la driver
connection al database.
test delle classi generate con hibernate
Possiamo finalmente verificare che tutto stia funzionando corettamente, scrivendo una opportuna classe di prova:
package test;
import org.hibernate.Transaction;
import hibernate.generated.Utenti;
import hibernate.generated.UtentiDAO;
public class TestProject {
public static void main(String[] args) {
Utenti ut = new Utenti();
ut.setNome("giuseppe");
ut.setCognome("astarita");
ut.setEmail("astaritagiuseppe@gmail.com");
UtentiDAO dao = new UtentiDAO();
System.out.println("start transaction..");
Transaction tx = dao.getSession().getTransaction();
tx.begin();
System.out.println("save record..");
dao.save(ut);
tx.commit();
System.out.println("commit transaction..");
dao.getSession().close();
System.out.println("close session..");
}
}
Utilizzando la nostra classe di prova otterremo come output:
Al lettore il compito di implementare le altre operazioni CRUD, quello che abbiamo potuto verificare è che MyEclipse offre un supporto eccellente allo sviluppatore per quanto riguarda l’automatizzazione di alcune operazioni garantendo anche una notevole stabilità in fase
di sviluppo.
qualche considerazione finale
- L’IDE MyEclipse è a pagamento, però i plugin utilizzati, sono disponibili (previa installazione) anche per le versioni free di eclipse.
- Se modifichiamo la struttura della tabella/e ed effettuiamo successivamente un vuovo Reverse Engineering la procedura riproduce il codice aggiornato che, a meno di non specificare un nuovo package, sovrascrive quello precedente. Se scegliamo un nuovo package sarà opportuno una procedura di versionamento del codice generato.
- Possiamo fare in modo che Hibernate gestisca in maniera trasparente il contesto transazionale
attraverso il tag xml
nel file<property name="hibernate.connection.autocommit">true</property>
hibernate.cfg.xml
- Le librerie hibernate importate prevedono un connettore verso il database: noi ne abbiamo utilizzato uno esterno perchè abbiamo creato prima il lato DB. In realtà potevamo procedere creando prima il progetto java, aggiungendo le
hibernate capabilities
, ed utilizzando il connettore java previsto nelle librerie di hibernate. Questo tipo di scelta ci vincola però all'aggiornamento di tutte le librerie se vogliamo aggiornare la versione del connettore. - Nel test code possiamo anche inserire una riga di codice che va a creare l’ID del’oggetto
Utenti
: Hibernate non considererà questo valore, cioè non lo userà come ID (Primary Key) perchè abbiamo delegato la generazione della chiave primaria al database.
Questo discorso però non vale per il primo ID, cioè se specifichiamo l’ID per il primo record/oggetto, questo verrà utilizzato dal database come ID di partenza mentre i successivi ID dei corrispondenti Utenti non verranno presi in considerazione. Ad esempio se specifichiamo il primo ID del primo oggetto comeID=5
verrà memorizzato un record con questo ID, ma tutti i successivi saranno 6,7,8,9 ecc. indipendentemente dai valori scelti.