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à Velocizzazione nella scrittura delle interrogazioni Manutenibilità Separazione tra modello di dominio e persistenza Performance 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