Corso di Sviluppo di applicazioni Web

Documenti analoghi
Il paradigm mismatch. Dott. Doria Mauro

Mapping delle collections. Dott. Doria Mauro

Programmazione in Java (I modulo) Lezione 20: Ereditarietà

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals()

Stringhe di caratteri

Un interfaccia è una classe completamente astratta, senza attributi(solo una collezione di firme di metodi pubblici e astratti)

Conoscere l uso delle collezioni in Java. Conoscere il concetto di Generics (programmazione

Hibernate Laboratorio

Vincoli. Chiavi esterne Vincoli locali e globali Triggers Leggere Cap 2 Riguzzi et al. Sistemi Informativi

La classe java.lang.object

Concetti Base Encapsulation ed Ereditarietà Programmare con l Ereditarietà. Java: Ereditarietà. Damiano Macedonio

Hibernate. Tool per Object Relational Mapping

PRODOTTO CARTESIANO Caso Generale

Anno Scolastico

Corso di Sviluppo di applicazioni Web

Collezioni, mappe e iteratori (a cura del Prof. Marco Patella)

Generics & Collections

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Corso di. Basi di Dati I. 7. Esercitazioni in SQL: Definizione e manipolazione dei dati

DDL (Data Definition Language) schemi DML (Data Manipulation Language) DQL (Data Query Language) DCL (Data Control Language)

Esercitazione 4 SQL: cataloghi e viste

SQL: le funzioni di aggregazione

JDBC vs ibatis. Un caso di studio. Fabrizio Gianneschi Atlantis S.p.A. 30 Ottobre 2004 Seminario JUG DIEE 1

Programmazione Java Avanzata

Corso di Basi di Dati A.A. 2015/2016

Notazione grafica UML

A.Veneziani Vincoli di integrità e vincoli di integrità referenziale

Gerarchia di classi Java 1

Corso di Algoritmi e Strutture Dati con Laboratorio. The JCF(continua): L interfaccia Map

Equivalenza di espressioni. Equivalenze. Equivalenze. Due espressioni sono equivalenti se: Atomizzazione delle selezioni σ F1 F2 (E) σ F1 (σ F2 (E))

IL MODELLO RELAZIONALE

Corso di. Basi di Dati I. 7. Esercitazioni in SQL: Definizione e manipolazione dei dati

Ereditarietà (ultima)

Ereditarietà (ultima)

Gerarchia di classi Java 1

SQL: DDL, VI, Aggiornamenti e Viste

Esempi in Java di program.ne O-O

OLTRE LE CLASSI OLTRE LE CLASSI

Riuso di classi. Ereditarietà. Ereditarietà. Spesso si ha bisogno di classi simili

SQL SQL. Definizione dei dati. Domini. Esistono 6 domini elementari:

Esercitazione 4 SQL: cataloghi e viste

Basi di Dati CREAZIONE E POPOLAMENTO DI UNA BASE DI DATI

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Corso di. Basi di Dati I. 11. Esercitazioni in SQL: Altri esercizi

INFORMATICA III Parte B -Progettazione e Algoritmi

Laboratorio di Basi di Dati

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

Programmazione Orientata agli Oggetti

Linguaggi e Traduttori

Introduzione Generics Iteratori. Collezioni in Java. Dr. Giulio Pellitta. 13 aprile 2011

Tipi numerici esatti Valori interi o con parte decimale di lunghezza prefissata

LABORATORIO di INFORMATICA

Esercitazione 4: Trigger in DB2

Esercitazione 4: Trigger in DB2

Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma. Ingegneria del software A

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Oggetti. La programmazione orientata agli oggetti, OOP (Object-Oriented Programming), prende il nome dall elemento su cui si basa, l oggetto.

D B M G D B M G 2. Sistemi informativi. Linguaggio SQL: costrutti avanzati

Lo standard ODMG. ODMG - componenti. Lo standard ODMG - scopo del consorzio ODMG ODL. ODMG, - risultati. ODMG 3.

SQL - Structured Query Language

Sul pattern Iterator

Progettazione del Software

Select From Where...

Progettazione del Software

Interfacce. Esempio: interfaccia I con una sola funzione g() public interface I {

ereditarietà e polimorfismo

Serializzazione Java. Serializzazione. Complicazioni 1/2. Complicazioni 2/2. Calendario esercitazioni e laboratori. Applicazioni della Serializzazione

Ereditarietà: concetti di base

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

Fondamenti di Informatica T-1. Ereditarietà & Polimorfismo

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Laboratorio di Sistemi Polimorfismo Java. Prerequisiti: per la comprensione dell'articolo è necessario conoscere il concetto di Ereditarietà in Java.

LA PROGETTAZIONE LOGICA

Uguaglianza e Identità. (no, non avete sbagliato corso )

OLTRE LE CLASSI OLTRE LE CLASSI OLTRE LE CLASSI OLTRE LE CLASSI. Alcune domande. Nella sua parte non statica, una classe

Implementare un'interfaccia

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Map<K,V> ESERCITAZIONE. Dalla documentazione Java 02/04/15

IPOTESI con riferimento al testo proposto come simulazione in preparazione all Esame di Stato 2015

Maps. a.k.a, associative array, map, or dictionary

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

1 Il Paradigma ad Oggetti

Entity Framework & SQL Server - Better Together

La classe Object. L2-Linguaggi di Programmazione II-unina 1

Introduzione al Java Collections Framework. Laboratorio di Programmazione Anno Accademico Interfacce del Collections Framework

Inizializzare oggetti

IL LINGUAGGIO SQL LE BASI

Mattia Fazzi: 14/05/2019

JSON JavaScript Object Notation. Sistemi Informativi Aziendali A.A. 2012/2013

Programmazione Orientata agli Oggetti in Linguaggio Java

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e Polimorfismo

Transcript:

Corso di Sviluppo di applicazioni Web Docente: Lorenzo Gallucci - Hibernate: gerarchie di classi ed associazioni

Mapping in Hibernate Hibernate comprende un set di istruzioni di mapping, per mezzo di annotazioni, conformi allo standard JPA Sebbene una gran parte delle capacità di Hibernate siano sfruttabili per mezzo di annotazioni JPA, alcune particolarità del framework sono accessibili solo tramite annotazioni specifiche di Hibernate Ad esempio, ottimizzazioni, come la dimensione di fetch, ecc. È possibile mescolare annotazioni JPA con annotazioni Hibernate Su quali classi si può operare?

Unità di persistenza (DTO) Hanno caratteristiche simili ai Javabean: Deve essere esplicitamente definito un costruttore pubblico Nessun metodo deve essere final La classe non deve essere final Per ogni proprietà sono richiesti I metodi get e set ( is è accettabile se si lavora con proprietà booleane) Poichè il modello ad oggetti deve avere validità di per sè, è utile non esporre le Collection Get di un campo collection dovrebbe restituire un oggetto immutabile (Collections.unmodifiable ()) Set va evitato Possono essere inseriti dei convenience method per I comportamenti che si vogliono rendere disponibili Ad es., un campo Collection<B> in A potrebbe disporre di un metodo addb() che, se presente, aggiorna un puntatore verso A in B

Unità di persistenza (DTO) Hibernate può accedere alle proprietà del DTO tramite Invocazione dei metodi get/set Accesso diretto ai campi del DTO Come può avvenire? L una o l altra modalità di accesso sono attivate dall annotazione @Id, presente sulle entità Se @Id è specificato su un metodo get, a tutte le proprietà si accede tramite i relativi metodi get/set Se @Id è specificato su un campo, a tutte le proprietà si accede tramite i campi che le rappresentano (saltando possibili validazioni inserite nei metodi set) In Hibernate è possibile intervenire in questo automatismo tramite l annotazione @AccessType

Unità di persistenza (DTO) Annotazioni sulle entità @Entity Indica che la classe è una entità sottoposta a persistenza @Table Può essere usato per indicare catalog, schema e name della tabella @UniqueConstraint Su ogni campo/proprietà: @Id Indica che una proprietà rappresenta la chiave della tupla Può essere usato @GeneratedValue per specificare una politica di generazione automatica della chiave @Column Consente di modificare il mapping generato per default su una proprietà Alcune opzioni: insertable, updatable, nullable, name, ecc. @Lob Richiede una gestione di tipo CLOB/BLOB per una proprietà @Temporal Indica il tipo di dato temporale da associare alla proprietà

Gerarchie di classi Possono essere gestite con 4 approcci differenti: Table per concrete class con mapping del polimorfismo Non si asserisce nulla riguardo il mapping dell ereditarietà Ogni classe diventa una tabella a sè, le proprietà sono ripetute come attributi in ogni tabella, se indicate come persistenti Table per concrete class Polimorfismo ed ereditarietà non hanno nessun mapping nello schema SQL Table per class hierarchy Si usa uno schema SQL denormalizzato, che riassume tutta la gerarchia di classi in un unica tabella Una colonna funge da discriminator quale delle classi di una gerarchia mappa la tupla? Table per subclass La relazione di ereditarietà is-a viene mappata come un has-a La classe principale dispone di una tabella, la quale riferisce, per mezzo di relazioni di chiave esterna, altre tabelle che contengono gli attributi specifici delle sottoclassi

Gerarchie di classi La modalità di mapping si specifica con l annotazione @Inheritance È sempre necessario l id nella superclasse InheritanceType.TABLE_PER_CLASS table per concrete class InheritanceType.SINGLE_TABLE table-per-class-hierarchy @DiscriminatorColumn indica l attributo discriminator (nella superclasse) @DiscriminatorValue va usato, nelle sottoclassi, per attribuire un valore al discriminator che funga da contrassegno Hibernate supporta anche la possibilità di desumere il discriminator per mezzo di una formula SQL Utile per il mapping di schemi legacy Si noti che, con questo approccio, i campi devono essere tutti nullable InheritanceType.JOINED table per subclass È anche possibile ottenere il comportamento equivalente solo per una sottoclasse, marcando quest ultima con @SecondaryTable

Table per concrete class con mapping del polimorfismo Non si asserisce nulla riguardo il mapping dell ereditarietà Ogni classe diventa una tabella a sè, le proprietà sono ripetute come attributi in ogni tabella, se indicate come persistenti Problemi: non supporta bene le associazioni polimorfe. Non basta una chiave esterna nella superclasse ma occorre in tutte le sottoclassi. Anche le query polimorfe sono un problema: richiede più queries sulle sottoclassi Duplicazione

@MappedSuperclass public abstract class BillingDetails implements Serializable, Comparable { @Column(name = "OWNER", nullable = false) private String owner; @Entity @AttributeOverride(name = "owner", column = @Column(name = "CC_OWNER", nullable = false) ) public class CreditCard extends BillingDetails { @Id @GeneratedValue @Column(name = "CREDIT_CARD_ID") private Long id = null; @Column(name = "NUMBER", nullable = false) private String number;

Table per concrete class con unione Condivisione delle proprietà della superclasse, no duplicazione Associazioni possibili a livello di superclasse Hibernate risolve le query polimorfe usando Union @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class BillingDetails { @Id @GeneratedValue private Long id = null; @Column(name = "OWNER", nullable = false) private String owner;... } @Entity @Table(name = "CREDIT_CARD") public class CreditCard extends BillingDetails { @Column(name = "NUMBER", nullable = false) private String number;... }

Table per class hierachy Si usa uno schema SQL denormalizzato, che riassume tutta la gerarchia di classi in un unica tabella Una colonna funge da discriminator quale delle classi di una gerarchia mappa la tupla? Strategia semplice e performante Ottima rappresentazione del polimorfismo Problemi: colonne devono essere nullable, denormalizzazione dello schema

@Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn( name = "BILLING_DETAILS_TYPE", discriminatortype = DiscriminatorType.STRING) public abstract class BillingDetails { @Id @GeneratedValue @Column(name = "BILLING_DETAILS_ID") private Long id = null; @Column(name = "OWNER", nullable = false) private String owner;...} @Entity @DiscriminatorValue("CC") public class CreditCard extends BillingDetails { @Column(name = "CC_NUMBER") private String number;... }

Table per subclass La relazione di ereditarietà is-a viene mappata come un has-a La classe principale dispone di una tabella, la quale riferisce, per mezzo di relazioni di chiave esterna, altre tabelle che contengono gli attributi specifici delle sottoclassi Ogni classe/sottoclasse (anche astratta) che ha proprietà persistenti ha la sua tabella. (Non c è duplicazione nelle sottoclassi) Ogni proprietà di una sottoclasse è memorizzta insieme ad una primary key che è anche chiave esterna nella tabella della superclasse

Vantaggi nella normalizzazione dei dati @Entity @Inheritance(strategy = InheritanceType.JOINED) public abstract class BillingDetails { @Id @GeneratedValue @Column(name = "BILLING_DETAILS_ID") private Long id = null;...} @Entity public class BankAccount {... } In subclasses, you don t need to specify the join column if the primary key column of the subclass table has (or is supposed to have) the same name as the primary key column of the superclass table BankAccount has no identifier property; it automatically inherits the BILLING_ DETAILS_ID property and column from the superclass, and Hibernate knows how to join the tables together if you want to retrieve instances of BankAccount. Of course, you can specify the column name explicitly: @Entity @PrimaryKeyJoinColumn(name = Bank_account_ID")

Mapping delle relazioni Managed relationships Hibernate non gestisce, lato Java, le associazioni permanenti In caso di problemi di comprensione delle associazioni con Hibernate, chiediamoci: Cosa farei se non stessi usando Hibernate? Infatti, Hibernate non cambia la semantica di Java che già conosciamo

Mapping delle relazioni Collections Set -> HashSet SortedSet -> TreeSet List -> ArrayList Collection (Bag) -> ArrayList Map -> HashMap SortedMap -> TreeMap

Mapping delle relazioni Relazione monodirezionale Si usa @ManyToOne(targetEntity= class) Marca una proprietà come foreign key verso una entità La classe dell entità obiettivo può essere omessa In tal caso, fa fede il tipo della proprietà desunto tramite reflection @JoinColumn(name=, nullable=false/true) Può essere usato per specificare che colonna generare per la foreign key

Mapping delle relazioni Per rendere la relazione bidirezionale, è sufficiente: Inserire una proprietà collection con opportuna semantica nell entità obiettivo Marcarla con @OneToMany(mappedBy= field ) Il nome del campo deve corrispondere a quello usato nella classe di partenza

Mapping delle relazioni Persistenza transitiva: La richiesta di salvare un oggetto sul DB può far partire, a catena, altre INSERT/UPDATE sugli oggetti collegati Usare cascade = {CascadeType.PERSIST, CascadeType.MERGE} Per propagare la richiesta di eliminazione a tutti gli oggetti dipendenti, si può usare cascade = {, CascadeType.REMOVE, } È necessario assicurarsi di essere gli unici proprietari dell oggetto Oggetti condivisi dovranno essere necessariamente eliminati ad uno ad uno, con una sequenza di operazioni in Java