back to top

ORM Data Access – Guida Java Spring

Spring supporta l'integrazione con molti framework per l'ORM (Object Relational Mapping), ma, per ragioni espositive, ci soffermeremo solo a vedere come integrare Hibernate e JPA in un progetto Spring.

Spring supporta questi framework per operazioni quali la gestione delle risorse, l'implemantazione dei DAO (Data Access Object) e la gestione delle transazioni. Attraverso l'integrazione con Spring è possibile configurare tali framework mediante l'uso del DI (Dipendency Injection). L'itegrazione con Spring, inoltre, consente di avere una serie di benefici come:

Facilità di test

Spring rende facile cambiare le configurazione e le implementazioni necessarie al framework per fare test in isolation.

Traduzione delle eccezioni

Spring può tradurre le eccezioni specifiche del framework di ORM in DataAccessException in modo che tali eccezioni possano essere gestite nei layers di business astraendosi dalle specifiche Api usate. Per fare questo Spring ha una propria gerarchia di DAO Exception che è applicabile a qualsiasi strategia di accesso ai dati. Ad esempio, se su usa direttamente JDBC, tutte le SQLException vengono tradotte in DataAccessException, includendo anche la traduzione dei codici di errore SQL. Se invece si usa un ORM come Hibernate o JDO si ha a che fare con HibernatException o PersistenceException che possono essere tradotte in IllegalArgumentException o IllegaleStateException, in modo da astrarsi dalla specifica implementazione del layer. Per abilitare la traduzione delle eccezioni basta usare l'annotation @Repository e configurare il PersistenceExceptionTranslationPostProcessor:

@Repository
public class MyDaoImpl implements MyDao {

  //................

}

e nell'applicationContext.xml:

<!-- Traduzione delle eccezioni -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="myDao" class="example.MyDaoImpl"/>

Gestione centralizzata delle risorse

l'application context di Spring riesce a recuperare facilmente tutte le risorse necessarie alla creazione dell'ORM, come ad esempio i DataSource o la configurazione del SessionFactory di Hibernate, centralizzando, di fatto, queste risorse e rendendo semplice il cambio delle stesse. Offre anche altri vantaggi, come ad esempio la condivisione della sessione in modo del tutto trasparente.

Gestione integrata delle transazioni

Spring permette di gestire le transazioni in modo automatico o manuale. Qualsiasi sia il modo scelto, il punto centrale della gestione delle transazioni è l'uso di AOP. Scegliendo la maniera automatica si deve fare uso della annotation @Transactional, se si preferisce la maniera manuale bisogna dichiare gli advice nel file di configurazione dell'application context. Questa gestione centralizzata rende, come sempre, facile passare da un gestore di transazioni ad un altro, come passare dalle transazioni locali a JTA.

La gestione delle transazioni verrà discussa in modo approfondito nei paragrafi successivi.

Lo scopo dello Spring ORM è quello di creare un layer applicativo di Data Access in modo da svincolare, da una parte, il layer di Business Logic dalle dipendeze legate all'accesso ai dati e alla gestione delle transazioni e dall'altra lo sviluppatore in modo da eliminare le singleton e l'hard-coded lookup delle risorse.

Nell'esempio seguente possiamo vedere un ORM layer che usa Hibernate per il data access e JTA per la gestione delle transazioni:

ORM Layer
PubblicitÃ