Hibernate Tool per Object Relational Mapping

Transcript

Hibernate Tool per Object Relational Mapping
Hibernate
Tool per Object Relational Mapping
Introduzione
●
Standard JDBC
●
Utilizzo di SQL
●
Non portabilità tra DB
●
Dialetti differenti
●
Scrittura di codice ripetitivo per CRUD
●
Paradigm mismatch
Paradigm mismatch
●
Problema della granularità
●
Problema dell'ereditarietà e polimorfismo
●
Problema dell'identità
●
Problema delle associazioni
●
Problema della navigabilità delle associazioni
●
N + 1 select problem
Benefici di una soluzione ORM
●
Produttività
●
●
Manutenibilità
●
●
Separazione tra modello di dominio e persistenza
Performance
●
●
Velocizzazione nella scrittura delle interrogazioni
Persistence unit e cache
Indipendenza dal DB sottostante
Hibernate
●
Un possibile tool di ORM è Hibernate
●
Esistono altri tool
●
Lo standard per la persistenza Java è JPA
●
●
●
JPA è soltanto una specifica
Diverse implementazioni di JPA (Hibernate,
OpenJPA, EclipseLink)
Hibernate e JPA
●
Non è necessariamente un'implementazione JPA
●
Può diventarlo con librerie aggiuntive
Hibernate e JPA
●
●
●
●
Hibernate ha più funzionalità di JPA
JPA è “obbligatorio” in ambiente enterprise
(application server)
Sono comunque molto simili
L'esempio che segue si basa su JPA standard
con implementazione Hibernate
Esempio
Librerie necessarie
●
●
Librerie Hibernate (www.hibernate.org)
●
./hibernate3.jar
●
./lib/required/*.jar
●
./lib/jpa/hibernate-jpa-2.0-api-1.0.0.Final.jar
●
./lib/optional/c3p0/c3p0-0.9.1.jar
Driver MySQL (www.mysql.com)
●
mysql-connector-java-5.1.14-bin.jar
MySQL
●
Scaricare e installare MySQL 5.1
●
Creare un DB vuoto chiamato jpa_test
●
Creare un utente jpa_test con stessa psw
●
Assegnare diritti all'utente
Eclipse
●
Scaricare Eclipse for JavaEE developers
●
Creare un progetto Java
●
Creare cartella lib e aggiungere librerie
●
Aggiungere librerie a classpath
●
Copiare il file persistence.xml in /src/META_INF
●
Analisi del file
●
Nessuna necessità di specificare le entità persistenti
●
Notare hibernate.hbm2ddl.auto = create
Creazione classe User
●
●
Classe User:
●
Id, name, lastName
●
Costruttore default e con nome e cognome
Mapping di User
●
@Entity
●
@Table
●
@Id, @GeneratedValue( strategy=GenerationType.AUTO)
●
@Column
Classe di Test
●
Creazione main in classe Test
●
Si crea l'EntityManagerFactory e EntityManager
●
EntityManagerFactory f = Persistence.createEntityManagerFactory("JPATest");
●
EntityManager em = f.createEntityManager();
●
Si istanzia User
●
Si rende persistente in una transazione
●
em.getTransaction().begin();
●
em.persist( u );
●
em.getTransaction().commit();
Prime considerazioni
●
Il database è stato creato automaticamente
●
Analisi delle annotations di mapping
●
Note su EntityManagerFactory e EntityManager
●
●
La prima è pesante e va creata solo una volta
La seconda è la unit-of-work, o persistence context. Tiene
traccia degli oggetti persistenti e coordina le operazioni di
persistenza in una transazione. Funziona anche da cache. Il
flush avviene automaticamente.
●
Lifecycle di un'entità: transient, persistent, detached
●
Identità e istanze in un persistence context.
Classe Department
●
Creazione classe:
●
Id, name, depCode (int)
●
Costruttore default e nome + depCode
●
Aggiunta del riferimento a Department in User
●
Aggiunta del @ManyToOne, nullabile
●
Aggiunta getter e setter
●
Creazione in Test di Department + persist
●
Aggiunta di dep in user
●
Rifattorizzazione in modo che Department venga
salvato per primo
Realzioni One to Many
●
Aggiunta della List<User> in Department
●
Aggiunta metodi getter setter + metodo add
●
●
Aggiunta del
@OneToMany(mappedBy,cascade)
Modifica di Test in modo da usare il metodo add
e non persistere user con entityManager
Spiegazioni su OneToMany
●
MappedBy per evitare doppi update
●
Cascade per la persistenza transitiva
●
Fare esempio anche per la cancellazione in cascata
(su una transazione differente)
Relazioni Many to Many
●
Creazione della classe Role
●
Collezione di Role in User
●
Mapping con @ManyToMany e @JoinTable
●
●
●
Aggiunta dei ruoli in Test con salvataggio
separato
Aggiunta dei ruoli all'utente
Creazione nuovo utente e assegnazione altri
ruoli
Interrogazioni con JPA QL
●
●
●
●
Aggiunta dei metodi toString alle entità
Interrogazione di base degli Utenti con find di
EntityManager
Navigazione su Department
Navigazione da Department su Users (con
query associata)
Interrogazioni con JPA QL
●
Aggiunta di un nuovo dipartimento e utente
●
Semplice select su User
●
Select con filtro su user
●
Select con filtro su Department
●
Select con filtro su Role
●
Con IN: select u from User u, IN(u.roles) r where r.name=:role
●
Con MEMBER OF: select u from User u, Role r where r.name=:role and r
member of u.roles

Documenti analoghi

3 Hibernate3 Introduzione a Hibernate

3 Hibernate3 Introduzione a Hibernate Mediazione tra strato business e database: gestione automatica e trasparente della persistenza tra oggetti Java e tabelle del database. Uso di metadati (XML) per la descrizione del mapping Astrarre...

Dettagli

Programmazione Java Avanzata

Programmazione Java Avanzata se si usa lo standard CamelCase le due parole vengono separate con underscore – Es: un oggetto di tipo User verrà salvato sulla tabella “user”, e la sua variabile firstName su un campo “first_name”

Dettagli