/*
* Copyright 2011 E.J.I.E., S.A.
*
* Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en
*
* http://ec.europa.eu/idabc/eupl.html
*
* Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,
* el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,
* SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
* Véase la Licencia en el idioma concreto que rige los permisos y limitaciones
* que establece la Licencia.
*/
package com.ejie.x38.dao;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import javax.persistence.EntityManager;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author UDA
*
* @param <T> Objeto Generico.
* @param <PK> Objeto Generico.
*
*/
@Transactional
public class GenericDaoImpl<T, PK extends Serializable> implements GenericDao<T, PK> {
private EntityManager em;
public void setEntityManager(EntityManager entityManager){
this.em = entityManager;
}
public EntityManager getEntityManager(){
return em;
}
private Class<T> classT; // cumple las veces de T.class que no es valido demomento en java.
@SuppressWarnings({ "unchecked", "rawtypes" })
public GenericDaoImpl() {
// Bueno pues como no se puede hacer T.class hay que hacer esta
// movida mediante introspección.
// this.classT = (Class<T>) ((ParameterizedType) getClass()
// .getGenericSuperclass()).getActualTypeArguments()[0];
// para obtener la clase T. es decir el primer parámetro generico
// mediante
// introspección.
// evitar un posible ClassCastException Por si acaso a su vez el tipo se
// trata de un generico
Type type = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
if (type instanceof ParameterizedType)
this.classT = (Class) ((ParameterizedType) type).getRawType();
else
this.classT = (Class) type;
}
@Override
public T add(T entity) {
this.em.persist(entity);
return entity;
}
@Transactional(readOnly = true)
@Override
public T find(PK id) {
return (T) em.find(classT, id);
}
@Override
public void remove(PK id) {
T entity = (T) em.find(classT, id);
em.remove(entity);
}
@Override
public T update(T entity) {
return em.merge(entity);
}
// @Transactional(readOnly = true)
// @SuppressWarnings("unchecked")
// @Override
// public List<T> findAll() {
// return em.createQuery("Select t from " + this.classT.getSimpleName() + " t").getResultList();
// }
}