Primi passi con Hibernate

Hibernate implementa la tecnica Object Relational Mapping (ORM). Tale tecnica permette di mappare oggetti di un qualsiasi linguaggio Object-Oriented (in questo caso Java)  su un database relazionale.

In particolare offre funzionalità quali:

  • Natural Programming Model: ovvero consente di sviluppare classi persistenti, quindi responsabili del salvataggio dello stato dell’applicazione su DB senza stravolgere il naturale svolgimento del paradigma Object-Oriented. E’ possibile quindi l’uso di eredarietà, polimorfismo, associazioni, composizioni e l’utilizzo delle Java Collections;
  • Transparent Persistence: non è richiesta l’implementazioni di interfacce o di classi base per permette di rendere persistenti classi o strutture dati;
  • High Performance: Hibernate supporta la lazy initialization ovvero la tattica di istanziare un oggetto, inizializzare una variabile, effettuare un calcolo od eseguire un processo solo nel momento in cui tale operazione è richiesta, nonchè la strategia del many fetching (recuperare più istanze possibili), l’optimistic locking e l’utilizzo di timestamp. Non richiede speciali tabelle o campi nel database e genera la maggior parte dell’SQL al momento dell”inizializzazione e non a runtime;
  • Reliability and Scalability:  è stato progettato per lavorare in applicazioni basata su cluster di Server e per fornire un’architettura altamente scalabile;
  • Extensibility: E’ sviluppato per essere altamente customizabile and estendibile.
  • Comprehensive Query Facilities: Include il supporto per l’Hibernate Query Language (HQL), Java Persistence Query Language (JPAQL), Criteria queries, e “native SQL” queries; ognuna delle quale è utile a seconda delle performance di ci si ha bisogno.

Per questa introduzione utilizziamo Eclipse Indigo con Maven 3.0. Il file pom.xml utilizzato è:


4.0.0
it.michelepierri.hibernate
contactList jar 0.0.1-SNAPSHOT
contactList
http://maven.apache.org
org.eclipse.m2e
lifecycle-mapping
1.0.0
org.apache.maven.plugins
maven-resources-plugin
[2.0,)

resources
testResources





mysql
mysql-connector-java
5.1.10


org.hibernate
hibernate
3.2.6.ga


org.hibernate
hibernate-annotations
3.4.0.GA


javax.transaction
jta
1.1

Per prima cosa creiamo quindi un file di configurazione di Hibernate chiamato Hibernate.cfg.xml.

Tale file contiene le informazioni di configurazione necessarie ad Hibernate per connettersi all’RDBMS:




org.hibernate.dialect.MySQL5InnoDBDialect com.mysql.jdbc.Driver xxxxx jdbc:mysql://localhost/contactList root true create

org.hibernate.cache.HashtableCacheProvider

thread




Nella configurazione è impostata la proprietà “hibernate.hbm2ddl.auto” a vero, il che significa che Hibernate si occuperà di creare automaticamente lo schema del database.

Andiamo quindi a creare la classe persistente che si occuperà di gestire gli oggetti Contatct.java:

package it.michelepierri;

import javax.persistence.Id;

import org.hibernate.annotations.Entity;

import org.hibernate.annotations.Table;

@Entity

//@Table(name="contacttable";, appliesTo = "")

public class Contact {

@Id

private int id;

private String name;

private String surname;

private String address;

private String telephone;

private String email;

public String getTelephone() {

return telephone;

}

public void setTelephone(String telephone) {

this.telephone = telephone;

}

public String getEmail() {

return email;

}

public void setEmail(String number) {

this.email = number;

}

public int getId() {

return id;

}

private void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSurname() {

return surname;

}

public void setSurname(String surname) {

this.surname = surname;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}

 

Hibernate necessita ora di conoscere come caricare e salvare gli oggetti della classe persistente sopra creata nel database. Per questo va creato un un file chiamato di Mapping che istruisce Hibernate su quale tabella del database lavorare ed in quali campi.

Per questo creiamo un file chiamato Contact.hbm.xml:

package it.michelepierri;

import javax.persistence.Id;

import org.hibernate.annotations.Entity;

import org.hibernate.annotations.Table;

@Entity

//@Table(name="contacttable", appliesTo = "")

public class Contact {

@Id

private int id;

private String name;

private String surname;

private String address;

private String telephone;

private String email;

public String getTelephone() {

return telephone;

}

public void setTelephone(String telephone) {

this.telephone = telephone;

}

public String getEmail() {

return email;

}

public void setEmail(String number) {

this.email = number;

}

public int getId() {

return id;

}

private void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSurname() {

return surname;

}

public void setSurname(String surname) {

this.surname = surname;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}

 

Fatto ciò creiamo una classe SessionFactoryUtil.java. Un oggetto di questa classe è usato creare, aprire una sessione per la connessione al database.

package it.michelepierri;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class SessionFactoryUtil {

private static final SessionFactory sessionFactory;

private static final Logger logger = Logger.getLogger(MyLog4J.class);

static {

try {

// Create the SessionFactory from hibernate.cfg.xml

sessionFactory = new Configuration().configure().buildSessionFactory();

} catch (Throwable ex) {

// Make sure you log the exception, as it might be swallowed

System.out.println("Initial SessionFactory creation failed");

throw new ExceptionInInitializerError(ex);

}

}

public static SessionFactory getSessionFactory() {

return sessionFactory;

}

}

 

Passo finale è quindi quello di testare il tutto mediante una classe di test che chiamiamo TestContactList.java:

package it.michelepierri;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.Session;

public class TestContactList {

public static void main(String[] args) {

Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();

session.beginTransaction();

createContactList(session);

queryContactList(session);

}

private static void queryContactList(Session session) {

Query query = session.createQuery("from it.michelepierri.Contact");

List lt;Contactgt;list = query.list();

java.util.Iteratorlt;Contactgt; iter = list.iterator();

System.out.println("Retrieving ContactList");

while (iter.hasNext()) {

Contact contact = iter.next();

System.out.println("ContactList: "" + contact.getName() +"", " + contact.getSurname() +"", " +contact.getAddress() + "", " + contact.getTelephone() + ", " + contact.getEmail());

}

session.getTransaction().commit();

}

public static void createContactList(Session session) {

Contact contact = new Contact();

contact.setName("Michele");

contact.setSurname("Pierri");

contact.setAddress("His House");

contact.setTelephone("123456");

contact.setEmail("[email protected]");

System.out.println("New Contact added on database");

session.save(contact);

}

}

Lanciando il programma otterremo questo output:

New Contact added on database

Retrieving ContactList

ContactList: “Michele”, Pierri”, His House”, 123456, [email protected]

Per scaricare il codice sorgente supporta il sito cliccando su uno dei tre pulsanti (Facebook,Twitter,Google+). Grazie!

[like_to_read]Download Progetto.[/like_to_read]

Michele Pierri

Sviluppatore android/web/desktop, blogger, nonchè sostenitore incallito dell’universo Cloud Computing, nel tempo libero amo fare sport e praticare arti marziali.