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