+ All Categories
Home > Documents > Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi...

Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi...

Date post: 01-Oct-2020
Category:
Upload: others
View: 1 times
Download: 0 times
Share this document with a friend
22
Laboratorio di sistemi Introduzione all'ORM Java Liberamente adattato da “Using the Java Persistence API in Desktop Application” di John O'Conner, http://java.sun.com/developer/technicalArticles/J2SE/Desktop/persistenceapi/ e dal volume “Java e Open Source” di Massimiliano Bigatti, Tecniche Nuove J2EE L'applicazione web che presenteremo (PersistenceWebApp) si fonda sulla cosiddetta tecnologia J2EE (Java to Enterprise Edition), cioè la versione Java per le grandi aziende: questa piattaforma software è formata da un ampio insieme di tecnologie alcune di queste rappresentate sinteticamente in fig. 1. Fig. 1 – Alcune tecnologie J2EE Tutte comunque richiedono, diciamo a più basso livello, la piattaforma standard di Java, cioè la J2SE (Java Standard Edition). EJB Il cuore della piattaforma J2EE è sicuramente la tecnologia EJB (Enterprise Java Bean) che definisce le specifiche per la realizzazione di componenti riutilizzabili (modellano la cosiddetta Logica di Business) per la grande azienda. Non confondiamo però le componenti EJB con i javabean (nati inizialmente per le interfacce utente e in seguito sfruttati per il supporto web e per le applicazioni standalone). In tutti e due i casi comunque è presente il concetto di componente cioè di una unità minima e indivisibile che implementa specifiche funzionalità. Nel caso degli EJB, questi componenti vivono all'interno di un application server, che fornisce loro servizi quali la persistenza, la transazionalità, il pooling, la denominazione (naming) e altri. Un application server è un prodotto software che implementa diversi servizi allo scopo di fornire un ambiente di esecuzione per i componenti J2EE. Solitamente sono presenti un Web Container, che si occupa di far girare componenti di presentazione implementati (come servlet o pagine JSP) con output HTML, e un EJB Container che esegue i componenti EJB. Tra gli application server open-source vi sono Jboss, Jonas, Orion e GlassFish (http://glassfish.dev.java.net). I prodotti commerciali più diffusi sono invece BEA WebLogic, WebSphere e Oracle AS. La Persistenza Il problema della registrazione delle informazioni su qualche forma di supporto di memoria è vecchio quanto l'informatica stessa. Nel corso degli anni, sono stati sviluppate diverse tecnologie ma la maggior parte delle volte si usano database relazionali. Le piattaforme orientate agli oggetti introducono un ulteriore elemento di complessità perchè con esse si ragiona a “oggetti” mentre con i database relazionali si ragiona sempre in termini di righe e di persistenza.pdf Pag. 1/22 Cozzetto ©
Transcript
Page 1: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Liberamente adattato da “Using the Java Persistence API in Desktop Application” di John O'Conner, http://java.sun.com/developer/technicalArticles/J2SE/Desktop/persistenceapi/ e dal

volume “Java e Open Source” di Massimiliano Bigatti, Tecniche Nuove

J2EEL'applicazione web che presenteremo (PersistenceWebApp) si fonda sulla cosiddetta tecnologia J2EE (Java to Enterprise Edition), cioè la versione Java per le grandi aziende: questa piattaforma software è formata da un ampio insieme di tecnologie alcune di queste rappresentate sinteticamente in fig. 1.

Fig. 1 – Alcune tecnologie J2EE

Tutte comunque richiedono, diciamo a più basso livello, la piattaforma standard di Java, cioè la J2SE (Java Standard Edition).

EJBIl cuore della piattaforma J2EE è sicuramente la tecnologia EJB (Enterprise Java Bean) che definisce le specifiche per la realizzazione di componenti riutilizzabili (modellano la cosiddetta Logica di Business) per la grande azienda. Non confondiamo però le componenti EJB con i javabean (nati inizialmente per le interfacce utente e in seguito sfruttati per il supporto web e per le applicazioni standalone). In tutti e due i casi comunque è presente il concetto di componente cioè di una unità minima e indivisibile che implementa specifiche funzionalità. Nel caso degli EJB, questi componenti vivono all'interno di un application server, che fornisce loro servizi quali la persistenza, la transazionalità, il pooling, la denominazione (naming) e altri.Un application server è un prodotto software che implementa diversi servizi allo scopo di fornire un ambiente di esecuzione per i componenti J2EE. Solitamente sono presenti un Web Container, che si occupa di far girare componenti di presentazione implementati (come servlet o pagine JSP) con output HTML, e un EJB Container che esegue i componenti EJB. Tra gli application server open-source vi sono Jboss, Jonas, Orion e GlassFish (http://glassfish.dev.java.net). I prodotti commerciali più diffusi sono invece BEA WebLogic, WebSphere e Oracle AS.

La PersistenzaIl problema della registrazione delle informazioni su qualche forma di supporto di memoria è vecchio quanto l'informatica stessa. Nel corso degli anni, sono stati sviluppate diverse tecnologie ma la maggior parte delle volte si usano database relazionali. Le piattaforme orientate agli oggetti introducono un ulteriore elemento di complessità perchè con esse si ragiona a “oggetti” mentre con i database relazionali si ragiona sempre in termini di righe e di

persistenza.pdf Pag. 1/22 Cozzetto ©

Page 2: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

colonne (tuple e attributi), organizzando le informazioni in strutture a griglia. Nei sistemi a oggetti, la struttura dei dati può essere più sofisticata e spesso non è riconducibile a un'organizzazione tabellare. Esiste dunque una impedenza tra database relazionali e sistemi a oggetti superabile se utilizziamo un componente intermedio che si occupi di migrare le informazioni da un formato all'altro. Un modello a oggetti necessita cioè di un livello di interfacciamento che ne adatti la forma, al fine di poter essere memorizzato in un database relazionale.

Fig. 2 – Object/relational Mapping

Questo strato intermedio è di solito sviluppato in due modi diversi:

1) Sviluppo manuale. Lo sviluppatore realizza una serie di oggetti di accesso ai dati, che attuano la corrispondenza tra le informazioni presenti negli oggetti e le tabelle della base di dati. Un approccio simile è di tipo manuale, dove ogni operazione di creazione, lettura, aggiornamento o cancellazione (CRUD, Create-Retrieve-Update-Delete) viene codificata nel programma.

2) Framework di persistenza. Il processo di realizzazione dello strato software relativo alla memorizzazione delle informazioni (persistenza) sono attività che richiedono una grande quantità di tempo. In tal caso, è preferibile utilizzare uno dei diversi framework di persistenza disponibili. Molti sono open-source ma ben testati e completi in termini di funzionalità (ad esempio Hybernate e TopLink della Oracle).

Il componente software che si occupa di eseguire le operazioni CRUD è chiamato motore di persistenza.Ci si riferisce spesso a questo componente anche come strumento di O/R mapping (obiect/relational mapping, mappatura oggetto-relazione).

Entità e Relazioni tra EntitàIl primo passo da compiere è definire le entità presenti nel sistema. Per esempio in un sistema di fatturazione, pensiamo alle entità Fattura, Prodotto, Cliente ecc. Ogni Entità sarà rappresentata da una classe java e poi resa persistente (parliamo di entità persistente o classe persistente) mediante un'operazione di “mappatura” della classe o “mapping” ad una tabella di un database relazionale. Ogni istanza della classe è una riga della tabella.Dal momento che le entità persistenti sono sostanzialmente classi java, parliamo anche di POJO (Plain Old Java Object).Come accade nel mondo reale, le entità ovviamente non lavorano da sole ma interagiscono con altre entità. Le classi possono avere i seguenti tipi di relazioni: uno-a-uno, uno-a-molti, molti-a-uno, molti-a-molti (la terminologia deriva infatti dal modello E-R adottato nella progettazione dei database). Trascuriamo per motivi di brevità la relazione uno-a-uno e molti-a-molti.Per la nostra applicazione, consideriamo l'entità Giocatore (di baseball), chiamiamola Player e l'entità Squadra (Team). Rappresentiamo le entità e la relazione tra le due entità con un diagramma UML:

persistenza.pdf Pag. 2/22 Cozzetto ©

Page 3: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Fig. 3 – Relazione Player-Team

Il rombo rappresenta un'aggregazione, mentre l'asterisco * si legge “molti” ed indica la molteplicità degli oggetti coinvolti nella relazione. Dal punto di vista del team, la relazione è di tipo “uno-a-molti”, mentre dal punto di vista del giocatore è di tipo “molti-a-uno”, cioè l'associazione è bidirezionale.

Le annotazioniDal punto di vista del codice java, ogni entità quindi deve essere preceduta dalla annotazione @Entity e deve implementare l'interfaccia Serializable in modo da consentire ad uno strumento esterno di salvarne lo stato. La classe persistente inoltre deve possedere un costruttore nullo (è possibile fare comunque l'overloading del costruttore) e una chiave primaria che può essere costituita da un solo campo o da più campi (annotazione @Id). I valori del campo chiave possono essere generati automaticamente (annotazione @GeneratedValue). La relazione Player->Team è di tipo “molti-a-uno” e richiede pertanto l'annotazione @ManyToOne. La classe Player deve possedere un reference alla classe Team il quale assume in tal modo il ruolo di chiave esterna. Usiamo inoltre l'annotazione @Transient per marcare proprietà transienti, cioè che non saranno memorizzate nel database.

File Player.java/** * Player.java */

package it.mauriziocozzetto.classi;

import java.io.Serializable;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.ManyToOne;

/** * * @author maurizio */@Entitypublic class Player implements Serializable { private static final long serialVersionUID = 1L; private Long id; private String lastName; private String firstName; private int jerseyNumber; private String lastSpokenWords; private Team team; // reference al team

// costruttore senza argomenti obbligatorio public Player() { }

persistenza.pdf Pag. 3/22 Cozzetto ©

Page 4: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

// costruttore con 4 argomenti public Player(String lName, String fName, int number, String words) { this.lastName = lName; this.firstName = fName; this.jerseyNumber = number; this.lastSpokenWords = words; }

// setter per l'id public void setId(Long id) { this.id = id; }

// l'annotazione @Id indica che il campo id rappresenta la chiave primaria obbligatoria // la proprietà strategy indica che i valori del campo id saranno generati automaticamente @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { return id; }

@Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; }

@Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Player)) { return false; } Player other = (Player) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; }

@Override public String toString() { String player = String.format("[Jersey Number: %d, Name: %s %s, Team: %s]" , jerseyNumber, firstName, lastName, team.getTeamName()); return player; }

public String getLastName() { return lastName; }

public void setLastName(String lastName) { this.lastName = lastName; }

persistenza.pdf Pag. 4/22 Cozzetto ©

Page 5: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

public String getFirstName() { return firstName; }

public void setFirstName(String firstName) { this.firstName = firstName; }

public int getJerseyNumber() { return jerseyNumber; } public void setJerseyNumber(int jerseyNumber) { this.jerseyNumber = jerseyNumber; }

@Transient public String getLastSpokenWords() { return lastSpokenWords; } public void setLastSpokenWords(String lastSpokenWords) { this.lastSpokenWords = lastSpokenWords; } // l'annotazione @ManyToOne denota una relazione "molti-a-uno" @ManyToOne public Team getTeam() { return team; }

public void setTeam(Team team) { this.team = team; }

} // fine Entità Player

La classe Team invece possiede un reference a una “collection” di oggetti di tipo Player. La collection sarà implementata concretamente mediante l'istanza di un oggetto di tipo HashSet. Gli elementi di una HashSet rappresentano un insieme ordinario di elementi unici, senza duplicati. La relazione Team->Player è di tipo “uno-a-molti” per cui usiamo l'annotazione @OneToMany(mappedBy = "team"), dove team è il reference inserito quale attributo nella classe Player. L'entità Team possiede inoltre due metodi per aggiungere e rimuovere oggetti di tipo Player.

/** * Team.java */

package it.mauriziocozzetto.classi;

import java.io.Serializable;import java.util.Collection;import java.util.HashSet;import javax.persistence.Entity;import javax.persistence.GeneratedValue;

persistenza.pdf Pag. 5/22 Cozzetto ©

Page 6: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.OneToMany;

/** * @author maurizio */@Entitypublic class Team implements Serializable { private static final long serialVersionUID = 1L; private Long id; private String teamName; private String league; private Collection<Player> players;

// costruttore senza argomenti public Team() { players = new HashSet(); } // overloading del costruttore public Team(String name, String league) { this.teamName = name; this.league = league; players = new HashSet(); } public void setId(Long id) { this.id = id; }

@Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { return id; }

@Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; }

@Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Team)) { return false; } Team other = (Team) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; }

persistenza.pdf Pag. 6/22 Cozzetto ©

Page 7: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

@Override public String toString() { //return "it.mauriziocozzetto.classi.Team[id=" + id + "]"; return "team"; }

public String getTeamName() { return teamName; }

public void setTeamName(String teamName) { this.teamName = teamName; }

public String getLeague() { return league; }

public void setLeague(String league) { this.league = league; }

@OneToMany(mappedBy = "team") public Collection<Player> getPlayers() { return players; }

public void setPlayers(Collection<Player> players) { this.players = players; } public void addPlayer(Player player) { players.add(player); } public boolean removePlayer(Player player) { return players.remove(player); }

} // fine Entità Team

Unità di persistenzaL'insieme delle entità in una applicazione è chiamato unità di persistenza (file XML persistence.xml). Il file ha molte funzioni ma principalmente serve ad assegnare il nome all'unità, a elencare tutte le entità coinvolte e a dichiarare il Provider di persistenza.

File persistence.xml<?xml version="1.0" encoding="UTF-8"?><persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="teamPU" transaction-type="JTA"> <provider>oracle.toplink.essentials.PersistenceProvider</provider> <jta-data-source>TeamJNDI</jta-data-source>

persistenza.pdf Pag. 7/22 Cozzetto ©

Page 8: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

<exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="toplink.ddl-generation" value="create-tables"/> </properties> </persistence-unit></persistence>

teamPU è l'unità di persistenza, mentre il Provider di Persistenza è TopLink Essentials (possiamo optare anche per un altro provider, ad esempio Hybernate). Il tipo di transazione è JTA (Java Transaction API).Vogliamo inoltre includere tutte le classi entità nella web application (valore del tag exclude-unlisted-classes), mentre il data-source è TeamJNDI (l'application server deve avere il supporto per JNDI). Create-tables denota invece la strategia di generazione delle tabelle.

JNDIDi JNDI (Java Naming and Directory Interface) e del Pool di connessioni abbiamo parlato nell'articolo “Approccio DAO”, categoria Java-Applicazioni web, file GuestBookDAO.pdf.

Riprendiamo qui il concetto di pool: un pool è un insieme di connessioni prestabilite che vengono lasciate in attesa di essere utilizzate. Quando il client ha bisogno di eseguire un'operazione, richiede una connessione al pool, esegue l'operazione e poi la ritorna al pool, occupando la risorsa solo per il tempo strettamente necessario. In tal modo il sistema risulta più efficiente. Dobbiamo indicare inoltre al sistema quale database utilizzare, indicando il nome del server, il nome del database, la porta, i driver, l'utente, la password ecc e come deve essere strutturato il Pool di connessioni. Il file XML sun-resources contiene queste informazioni.

File sun-resources.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd"><resources> <jdbc-resource enabled="true" jndi-name="TeamJNDI" object-type="user" pool-name="mysqlPool"/> <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysqlPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> <property name="databaseName" value="team_db"/> <property name="serverName" value="localhost"/> <property name="portNumber" value="3306"/> <property name="User" value="test"/> <property name="Password" value="testtest"/> <property name="URL" value="jdbc:mysql://localhost:3306/team_db"/> <property name="driverClass" value="com.mysql.jdbc.Driver"/> </jdbc-connection-pool></resources>

persistenza.pdf Pag. 8/22 Cozzetto ©

Page 9: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Il database della nostra applicazione web, team_db, è stato creato precedentemente ed è in questa fase ancora vuoto. Ovviamente, perchè le cose funzionino, abbiamo bisogno del driver java di tipo 4 MySQL-J-Connector (http://www.mysql.com).

Entity ManagerPer rendere persistente una entità, abbiamo bisogno di un istanza di tipo EntityManager. Per farlo, dobbiamo prima creare un oggetto di tipo EntityManagerFactory. Successivamente dobbiamo ottenere una transazione, rendere persistente gli oggetti che ci interessano e successivamente chiudere le risorse allocate.

File index.jsp<%-- Document : index Created on : 24-mar-2008, 17.05.08 Author : maurizio--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%><%@page import="it.mauriziocozzetto.classi.*"%><%@page import="javax.persistence.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Persistence Demo</title> </head> <body> <h3>Hello World!</h3> <% // allochiamo in memoria 3 istanze dei Dodgers players Player[] dodgersPlayers = new Player[] { new Player("Lowe", "Derek", 23, "You just can't touch that sinker."), new Player("Kent", "Jeff", 12, "I'm getting too old for this."), new Player("Garciaparra", "Nomar", 5, "No, I'm not superstitious at all.") }; // allochiamo 3 istanze dei Giant players Player[] giantsPlayers = new Player[] { new Player("Pettitte", "Andy", 46, null), new Player("Jeter", "Derek", 2, null), new Player("Rodriguez", "Alex", 13, null) }; // creiamo 4 squadre Team[] teams = new Team[] { new Team("Los Angeles Dodgers", "National"), new Team("San Francisco Giants", "National"), new Team("Anaheim Angels", "American"), new Team("Boston Red Sox", "American") };

persistenza.pdf Pag. 9/22 Cozzetto ©

Page 10: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

// istanziamo un oggetto di tipo EntityManagerfactory EntityManagerFactory emf = Persistence.createEntityManagerFactory("teamPU"); // istanziamo un oggetto di tipo EntityManager EntityManager em = emf.createEntityManager(); // prepariamo la transazione em.getTransaction().begin();

// rendiamo persistenti le 4 squadre for(Team team: teams) { em.persist(team); }

// rendiamo persistenti i giocatori del Dodgers for(Player player: dodgersPlayers) { player.setTeam(teams[0]); teams[0].addPlayer(player); em.persist(player); }

// rendiamo persistenti i giocatori del Giant for (Player player: giantsPlayers) { player.setTeam(teams[1]); teams[1].addPlayer(player); em.persist(player); }

// rendiamo effettive le modifiche em.getTransaction().commit();

// chiudiamo le risorse allocate em.close(); emf.close();

out.println("Create le tabelle"); %> </body></html>

persistenza.pdf Pag. 10/22 Cozzetto ©

Page 11: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Ecco il risultato dell'esecuzione della pagina nel browser:

Fig. 4 – Il messaggio di avviso della creazione delle tabelle

Fig. 5 – La struttura della tabella Player

Fig. 6 – La struttura degli indici della tabella Player

Fig. 7 – I record memorizzati nella tabella Player

persistenza.pdf Pag. 11/22 Cozzetto ©

Page 12: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Fig. 8 – La struttura della tabella Team

Fig. 9 – La struttura degli indici della tabella Team

Fig. 10 – I dati della tabella Team

RicercaOra il database (che prima era vuoto) dispone di giocatori e di squadre. Se conosciamo il valore della chiave primaria, mediante il metodo find dell'oggetto EntityManager, possiamo ritrovare gli oggetti che ci interessano.

Fig. 11 – Ricerca di un particolare oggetto (chiave primaria 352)

persistenza.pdf Pag. 12/22 Cozzetto ©

Page 13: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

File find.jsp<%-- Document : find Created on : 25-mar-2008, 19.10.17 Author : maurizio--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%><%@page import="it.mauriziocozzetto.classi.*"%><%@page import="javax.persistence.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Metodo Find</title> </head> <body> <h3>Metodo Find</h3> <% // Crea l'EntityManager EntityManagerFactory emf = Persistence.createEntityManagerFactory("teamPU"); EntityManager em = emf.createEntityManager();

// ricerca del record con chiave 352 long primaryKey = 352; out.println("Cerco il giocatore con chiave "+primaryKey+"<br/>"); // cerco l'oggetto con la chiave primaria specificata Player player = em.find(Player.class, primaryKey); if (player != null) out.println(player.toString()); else out.println("Il record con chiave "+primaryKey+" non è stato trovato"); // chiudo gli oggetti creati precedentemente em.close(); emf.close(); %> </body></html>

QuerySebbene il metodo find lavora bene, è possibile raggiungere una maggiore flessibilità effettuando delle vere e proprie interrogazioni sulle entità in maniera simile a quanto accade nei database relazionali, attraverso il linguaggio JPQL (Java Persistence Query Language). Il linguaggio è simile al linguaggio SQL ma ha dei benefici su SQL. Il JPQL opera su entità e relazioni piuttosto che sullo schema relazionale corrente. Questo rende le query più portabili nei confronti del database soggiacente.

persistenza.pdf Pag. 13/22 Cozzetto ©

Page 14: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

File retrievePlayer.jsp<%-- Document : retrievePlayer Created on : 25-mar-2008, 20.03.06 Author : maurizio--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%><%@page import="it.mauriziocozzetto.classi.*"%><%@page import="javax.persistence.*"%><%@page import="java.util.List"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Query</title> </head> <body> <h3>Query</h3> <% // imposta una squadra String aTeamName = "Los Angeles Dodgers"; // Crea l'EntityManager EntityManagerFactory emf = Persistence.createEntityManagerFactory("teamPU"); EntityManager em = emf.createEntityManager(); // crea la query Query q = em.createQuery("select c from Player c where c.team.teamName = :name"); // imposta il parametro q.setParameter("name", aTeamName); // prepara una struttura dati di appoggio List<Player> playerList = q.getResultList();

// scorre la lista dei risultati for(Player p : playerList) { out.println(p.toString()+"<br/>"); }

// chiude l'Entity Manager e l'EntityManagerFactory em.close(); emf.close(); %> </body></html>

persistenza.pdf Pag. 14/22 Cozzetto ©

Page 15: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Fig. 11 – Il risultato della query

Aggiornamento e cancellazioneAllo stesso modo, possiamo effettuare delle operazioni di aggiornamento o di cancellazione scrivendo un codice simile a quello presentato precedentemente. Ad esempio possiamo incrementare di 1 il contenuto del campo JERSEYNUMBER usando il linguaggio JPQL.

File update.jsp<%-- Document : update.jsp Created on : 25-mar-2008, 19.10.17 Author : maurizio --%>

<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import="it.mauriziocozzetto.classi.*"%> <%@page import="javax.persistence.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Metodo Update</title> </head> <body> <h3>Metodo Update</h3> <% // Creiamo l'EntityManager EntityManagerFactory emf = Persistence.createEntityManagerFactory("teamPU"); EntityManager em = emf.createEntityManager(); // Fissiamo un team String aTeamName="Los Angeles Dodgers";

persistenza.pdf Pag. 15/22 Cozzetto ©

Page 16: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

out.println("Effettuo l'aggiornamento di tutti i record del Team "+aTeamName+" aumentando di 1 il campo JERSEYNUMBER<br/>"); // Creiamo la query di aggiornamento Query q = em.createQuery("update Player p set p.jerseyNumber = (p.jerseyNumber+1) where p.team.teamName = :name"); // Fissiamo il nome del Team come parametro della query q.setParameter("name",aTeamName); // Inizio della transazione em.getTransaction().begin(); // Eseguiamo la query di aggiornamento q.executeUpdate(); // Commit della transazione em.getTransaction().commit(); out.println("Aggiornamento effettuato"); // Chiusura gli oggetti creati precedentemente em.close(); emf.close(); %> </body> </html>

Fig. 12 – Tutti i record sono stati aggiornati

Oppure possiamo cancellare un record nella tabella team.

persistenza.pdf Pag. 16/22 Cozzetto ©

Page 17: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

File delete.jsp<%-- Document : delete.jsp Created on : 25-mar-2008, 19.10.17 Author : maurizio --%>

<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import="it.mauriziocozzetto.classi.*"%> <%@page import="javax.persistence.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Delete</title> </head> <body> <h3>Delete</h3> <% // Creiamo l'EntityManager EntityManagerFactory emf = Persistence.createEntityManagerFactory("teamPU"); EntityManager em = emf.createEntityManager(); // Fissiamo un team String aTeamName="Anaheim Angels"; out.println("Effettuo la cancellazione del Team "+aTeamName+"<br/>"); // Creiamo la query di cancellazione Query q = em.createQuery("delete from Team t where t.teamName = :name"); // Fissiamo il nome del Team come parametro della query q.setParameter("name",aTeamName); // Inizio della transazione em.getTransaction().begin(); // Eseguiamo la query di cancellazione q.executeUpdate(); // Commit della transazione em.getTransaction().commit(); out.println("Cancellazione effettuata"); // Chiusura gli oggetti creati precedentemente em.close(); emf.close(); %> </body> </html>

persistenza.pdf Pag. 17/22 Cozzetto ©

Page 18: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Fig. 13 – Cancellazione di un record

NetbeansNetBeans offre un IDE estremamente ricco di funzionalità per lo sviluppo di applicazioni J2EE. Ma perchè tutto funzioni correttamente è necessario predisporre l'ambiente in maniera opportuna. L'esempio è stato sviluppato con la versione 6.1 beta in ambiente Windows.

Fig. 14 – Prepariamo l'applicazione web (File > New Projects ...)

persistenza.pdf Pag. 18/22 Cozzetto ©

Page 19: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Fig. 15 – Scegliamo quale Server GlassFish e la versione J2EE 5. Poi confermiamo tutte le impostazioni proposte.

Fig. 16 – Per creare una Entity Class, clicchiamo col tasto destro del mouse sul nome del progetto e scegliamo New > Entity Class...Successivamente diamo un nome alla classe e al package e scegliamo il tipo della chiave primaria. Tuttavia non possiamo procedere oltre se prima non creiamo l'Unità di Persistenza (pulsante Create Persistence Unit...)

persistenza.pdf Pag. 19/22 Cozzetto ©

Page 20: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Fig. 17 – Creiamo l'unità di Persistenza

Fig. 18 – Creiamo un Data Source

Fig. 19 – Creazione della connessione al database e del nome JNDI

persistenza.pdf Pag. 20/22 Cozzetto ©

Page 21: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Fig. 20 – Completiamo la finestra con le informazioni sul database

Fig. 21 – Confermiamo la connessione

persistenza.pdf Pag. 21/22 Cozzetto ©

Page 22: Laboratorio di sistemi Introduzione all'ORM Java · 2008. 4. 1. · Laboratorio di sistemi Introduzione all'ORM Java colonne (tuple e attributi), organizzando le informazioni in strutture

Laboratorio di sistemi Introduzione all'ORM Java

Fig. 22 – Abbiamo creato il nome JNDI

Fig. 23 – Ora abbiamo il Data Source e possiamo creare l'Unità di Persistenza

Fig. 24 – Possiamo ora creare l'Entità Player. In maniera analoga si procede con l'Entità Team

persistenza.pdf Pag. 22/22 Cozzetto ©


Recommended