Università degli Studi di Padova
Dipartimento di Ingegneria Dell’informazione
Corso di Laurea Triennale in Ingegneria Informatica
Tesi di Laurea
STUDIO DI HIBERNATE ATTRAVERSO I COSTRUTTI
DEL MODELLO RELAZIONALE
26 Luglio 2012
Laureando: Marco Carraro
Relatore: Prof. Giorgio Maria Di Nunzio
Anno Accademico 2011/2012
SOMMARIO
• Hibernate
• Obiettivi
• POJO e file XML
• Esempio implementazione associazione uno a molti
• Conclusioni
26 Luglio 2012
Marco Carraro
2/15
Hibernate
Problema: Persistenza degli oggetti
26 Luglio 2012
Marco Carraro
3/15
Obiettivi
• Fornire documentazione sull’implementazione di
schemi relazionali con Hibernate
• Analizzare vantaggi introdotti da Hibernate ed
eventuali incompatibilità con alcuni schemi
relazionali
26 Luglio 2012
Marco Carraro
4/15
POJO e XML - 1
Di cosa ha bisogno Hibernate per mappare le classi
nel modello relazionale?
• Classi Java rappresentanti i concetti (POJO)
• File di mappatura (in XML) solitamente uno per
classe
26 Luglio 2012
Marco Carraro
5/15
POJO e XML - 2
Esempio POJO:
public class Classe{
private long id;
…
public Classe(){}
…
//setter and getter
//other methods
}
26 Luglio 2012
Marco Carraro
6/15
POJO e XML - 3
Struttura tipico file XML di mappatura:
<!Doctype….>
<hibernate-mapping>
<class>
<id>Def id</id>
<param name=“attr” not-null=“true” unique=“true”/>
<one-to-one …/>
<one-to-many …/>
<many-to-one …/>
<many-to-many …/>
</class>
</hibernate-mapping>
26 Luglio 2012
Marco Carraro
7/15
Esempio
Associazione Uno a Molti - 1
Traduzione in schema relazionale scelta:
26 Luglio 2012
Marco Carraro
8/15
Esempio
Associazione Uno a Molti - 2
Per il funzionamento necessari 6 file
User.java
• 3 classi Java
Item.java
Buyer.java
User.hbm.xml
• 3 file XML
Item.hbm.xml
Buyer.hbm.xml
26 Luglio 2012
Marco Carraro
9/15
Esempio
Associazione Uno a Molti - 3
USER.JAVA
FRAMMENTO USER.HBM.XML
import java.util.Set;
import java.util.HashSet;
…
<property name=“login” not-null=“true”/>
public class User {
<set name="items" table="BUYER">
private long id;
<key column="BUYER_ID"/>
private String login;
<one-to-many class="Buyer"/>
private Set<Buyer>items=new HashSet<Buyer>(); </set>
// constructors setter and getter
…
}
26 Luglio 2012
Marco Carraro
10/15
Esempio
Associazione Uno a Molti - 4
ITEM.JAVA
public class Item {
private Long id;
private String name;
private String description;
private User buyer=null;
//constructors, setter and getter
FRAMMENTO ITEM.HBM.XML
…
<join table="BUYER" inverse="true">
<key column="ITEM_ID" unique="true"/>
<many-to-one name="buyer" class="User"
column="BUYER_ID"/>
</join>
…
}
26 Luglio 2012
Marco Carraro
11/15
Esempio
Associazione Uno a Molti - 5
BUYER.JAVA
public class Buyer {
public static class Id{
private long itemId;
private long userId;
//constructors, getter and setter
}
private Id id=new Id();
private User user;
private Item item;
private double amount;
//constructors, getter and setter
}
26 Luglio 2012
FRAMMENTO BUYER.HBM.XML
<class name="Buyer" table="BUYER"
mutable="false">
<composite-id name="id" class="Buyer$Id">
<key-property name="itemId" access="field"
column="ITEM_ID"/>
<key-property name="userId" access="field"
column="BUYER_ID"/>
</composite-id>
<property name="amount" column="AMOUNT"/
>
<many-to-one name="user” not-null="true"
insert="false" update="false"/>
<many-to-one name="item” not-null="true"
insert="false" update="false"/>
</class>
Marco Carraro
12/15
Esempio
Associazione Uno a Molti - 6
Problema: schema relazionale ottenuto diverso da quello di partenza
Schema voluto:
Schema ottenuto:
Vincolo: Su Item della relazione BUYER c’è un vincolo unique
26 Luglio 2012
Marco Carraro
13/15
Conclusioni - 1
Vantaggi:
• Notevole riduzione codice necessario per
persistenza
• Elevato riutilizzo codice tra applicazioni
diverse
• Miglior controllo delle performance con
DataBase Connection Pool
26 Luglio 2012
Marco Carraro
14/15
Conclusioni - 2
Svantaggi:
• Introduzione di latenza rispetto alla
soluzione con JDBC
• Compatibilità non completa con tutti i
modelli relazionali
26 Luglio 2012
Marco Carraro
15/15