Rifacendoci all'esempio del paragrafo precedente, vediamo come creare il DAO per l'entity Car.
Prima di tutto creaimo una interfaccia con i metodi base di un DAO e cioè: caricamento, salvataggio, aggiornamento e cancellazione.
package it.mrwebmaster.hibernate.dao;
import it.mrwebmaster.hibernate.Car;
public interface CarDao {
public Car load(Integer id);
public Car save(Car car);
public Car update(Car car);
public void remove(Car car);
}
Creata l'interfaccia passiamo alla creazione della implementazione:
package it.mrwebmaster.hibernate.dao;
import it.mrwebmaster.hibernate.Car;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class CarDaoImpl implements CarDao {
@PersistenceContext(unitName = "pu")
private EntityManager em;
@Override
public void remove(Car car) {
em.remove(car);
}
@Override
@Transactional(readOnly=true)
public Car load(Integer id) {
return em.find(Car.class, id);
}
@Override
public Car save(Car car) {
em.persist(car);
return car;
}
@Override
public Car update(Car car) {
return em.merge(car);
}
public void setEm(EntityManager em) {
this.em = em;
}
public EntityManager getEm() {
return em;
}
}
e infine nell' applicationContext.xml:
<!-- CAR DAO -->
<bean id="carDaoImpl" class="it.mrwebmaster.hibernate.dao.CarDaoImpl" />
Come si può osservare per implementare il nosto DAO abbiamo bisogno dell'EntityManager, il quale ci viene iniettato direttamente dall' IoC attraverso l'uso della annotation @PersistenceContext.
Le implementazioni dei singoli metodi sono banali, si limitano a delegare l'operazione all'EntityManager. Per quanto riguarda invece la gestione delle transazioni, si è scelto di usare la annotation @Transactional. In questo modo Spring nel creare l'istanza del nostro DAO userà un proxy il cui compito è quello di aprire e chiudere le transazioni prima della chiamata ad un metodo e subito dopo l' uscita dal metodo stesso facendo un commit o un rollback in caso di errore. Si noti, infine, l’utilizzo dell’attributo ReadOnly nell’annotation @Transactional per il metodo load; così facendo si è creata una transizione in sola lettura.
Questa gestione delle transazioni avviene grazie all'uso di AOP; per abilitarlo basta aggiungere al nostro applicazionContext.xml:
<!-- GESTIONE TRANSAZIONI -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />