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
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...
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”