tutorial 0) Far girare un DBMS. 1) Aggiungere nelle dipendenze di un nuovo progetto Maven: * hibernate-core * mysql-connector-java 2) In src/main/resources metto hibernate.cfg.xml. Essenziale perchè altrimenti non funziona un cazzo. (vedi allegato) 3) Creare una classe HibernateUtils (vedi slide 35). Ha come scopo rendere accessibile sotto forma singleton la SessionFactory, oggetto thread safe che rappresenta le connessioni alla base dati. Da SessionFactory si può creare la sessione. L'unico metodo che ci serve è getSessionFactory() 4) Siccome siamo nel contesto di un'applicazione Servlet e vogliamo che tutti si servano facilmente di Hibernate creiamo un filtro. HibernateSessionFilter (1:14:00, lezione 14). Il filtro ha una variabile privata di tipo SessionFactory che si va a procurare nel metodo init(). Il metodo destroy serve a rilasciare le risorse nel DB quando viene fatto l'undeployment. Quando arriva una richiesta e quindi parte il doFilter(): - procurati la sessione corrente, inaccessibile ad altri thread - successivamente si costruisce una transazione nel contesto della sezione - si passa l'elaborazione a filtri e servlet a cui è destinata questa cosa - quando tutti hanno finito si fa il commit - se c'è qualche problema si può fare il rollback di transazione oppure un'altra cosa. In ogni caso si rilancia. - alla fine di tutto si chiude Si noti che il filtro è da registrare in web.xml e l'URL pattern è /* perchè si applica su chiunque faccia richiesta 5) Scrivo l'applicazione Web (1:20:00, lezione 14) 1agina p hibernate.cfg.xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> Informazioni legate al DB <!-- Database connection settings --> <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.url">jdbc:hsqldb:hsql://localhost</property> <property name="connection.username">sa</property> <property name="connection.password"></property> Nelle applicazioni reali non si usa questo <!-- JDBC connection pool (use the built-in) --> connection pool perchè è "scarso": possiamo <property name="connection.pool_size">1</property> usare il DataSource. Per iniziare comunque va bene. <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.HSQLDialect</property> Dialetto Hibernate <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> Informazioni generali per configurare l'ambiente di esecuzione: buono avere una session per thread per gestire la cosa da filtri. <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> In questo modo sulla console di Tomcat vedo le singo<!-- Echo all executed SQL to stdout --> le operazioni eseguite, e così capisco che cosa sta succedendo in background. Volendo posso dirgli anche <property name="show_sql">true</property> di formattare l'otuput (format_sql) <!-- Drop and re-create the database schema on startup --> Come si comporta Hibernate <property name="hbm2ddl.auto">update</property> se c'è un mismatch tra DB <mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/> e insieme di oggetti? * </session-factory> </hibernate-configuration> * In produzione si tiene validate. I valori possibili sono: - create: tutte le volte che viene lanciato cancella lo schema per intero e crea tante tabelle quante sono le entità annotate - update: confronta la base dati con gli oggetti e se ci sono le differenze modifica la base dati. Pericoloso, quindi evitiamo. Il mapping è molto più comodo da fare qui insieme alle annotazioni e non sull'hbm.xml. Page 1