Oggi esistono molteplici modi per gestire la persistenza in applicazioni J2EE:
- Hibernate
- Entity Bean
- Entity BMP
- DAO con classi POJO
- Spring
- e altro ancora
In questo articolo mi vorrei soffermare su una mia implementazione del pattern DAO.
Problema
Persistere un'entity rispettando i seguenti requisiti:
- indipenenza dal back end (DB2, Oracle, XML, LDAP, Lucene, ecc.);
- possibilità di far partecipare uno o più DAO ad una singola transazione;
- nascondere le eccezioni specifiche di ciascun back end;
- persistere una entità logica e non fisica (qusto implica che un DAO può manipolare una o più tabelle se queste rappresentano un'unica entità logica).
Soluzione
La prima cosa che faccio quando sviluppo applicazioni web è quella di identificare le entità logiche del problema (domain problem). Ad ogni entità associo un DAO che sarà responsabile di tutte le attività di persistenza su quell'entità, es. le operazioni CRUD (CRreate, Update, Delete).
Iniziamo con il definire la nostra entità.
A questo punto creiamo un'interfaccia DAO per la nostra entity.
A seconda dei back end che vogliamo supportare implementeremo l'interfaccia DAOEntity. Prima di fare ciò, è necessario definire una factory che, in base ad un parametro di configurazione, instanzia l'implementazione specifica per un dato back end.
A questo punto, per ogni back end, va implementata una classe che estende DAOFactory e implementa i metodi astratti.
Vediamo ora un'ipotetica implementazione di DAO entity nell'ipotesi che il back end sia DB2. In particolare vedremo l'implementazione della create, le altre sono più o meno simili.
Si osservi come la transazione viene aperta nel business layer e passata al DAO attraverso l'area local al thread (ThreadLocal, vedi articolo Transazioni JDBC). Il DAO gestisce solo statement e result set (quest'ultimo solo nei finders). E' importante l'uso del finally per la chiusura degli statement e result set.
Page Information
|
Wiki Information
|
Recent PBwiki Blog Posts |