back to top

Data Access – Creazione DAO e gestione delle transazioni – Guida Java Spring

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" />
PubblicitÃ