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”