2011-11-22 16 views
5

Los archivos de configuración My Spring + Hibernate son pequeños y súper ajustados. Uso el escaneo automático para encontrar mis entidades/daos modelo.Escribir menos DAO con Spring Hibernate usando las anotaciones

No quiero tener que escribir un DAO + DAOImpl para CADA entidad en mi jerarquía.

Algunos pueden calificar para tener los suyos, como si tuvieran relaciones complejas con otras entidades y requirieran más que la funcionalidad CRUD básica. Pero para el resto ...

¿Hay alguna forma de eludir el estándar de facto?

decir, algo como un DAO genérico, por ejemplo:

http://www.ibm.com/developerworks/java/library/j-genericdao/index.html

Entonces puedo hacer algo como

GenericDao dao = appContext.getBean("genericDao"); 
    dao.save(car);    
    dao.save(lease); 

¿Es esto posible con anotaciones? No quiero tener que configurar nada en xml. Si no puedo hacer más arriba, es todavía posible tener un GenericDaoImpl.java con algo como:

@Repository("carDao") 
@Repository("leaseDao") 
class GenericDaoImpl extends CustomHibernateDaoSupport implements GenericDao { 
... 
} 

y luego

GenericDao dao = appContext.getBean("carDao"); 
    dao.save(car);    
    dao = appContext.getBean("leaseDao"); //carDao is garbage coll. 
    dao.save(lease); 

¿Es esta práctica en absoluto?

Respuesta

5

El uso de los genéricos, puede intentar algo como esto:

@Repository 
@Transactional 
public class GenericDAOImpl<T> implements GenericDAO<T> { 

    @Autowired 
    private SessionFactory factory; 

    public void persist(T entity) { 
     Session session = factory.getCurrentSession(); 
     session.persist(entity); 
    } 

    @SuppressWarnings("unchecked") 
    public T merge(T entity) { 
     Session session = factory.getCurrentSession(); 
     return (T) session.merge(entity); 
    } 

    public void saveOrUpdate(T entity) { 
     Session session = factory.getCurrentSession(); 
     session.saveOrUpdate(entity); 
    } 

    public void delete(T entity) { 
     Session session = factory.getCurrentSession(); 
     session.delete(entity); 
    } 

} 

El contenido puede ser diferente, pero la idea general es aplicable.

Usted debe ser capaz de entonces Autowire la DAO en su controlador y servicios clases utilizando

@Autowired 
private GenericDAO<Car> carDao; 
+0

Me gusta esta idea, pero ¿funciona? Esperaría que el borrado de tipo llevara a una definición de bean duplicada, pero no lo he comprobado ... – seanhodges

+1

Buscando alrededor, parece que se puede evitar el borrado usando interfaces secundarias: http: // stackoverflow.com/questions/502994/spring-ioc-and-generic-interface-type – seanhodges

+0

Solo para aclarar, Autowired en SessionFactory conectará automáticamente la SessionFactory de Hibernate en Spring, ¿verdad? Pero, ¿qué ocurre si mi CustomHibernateDaoSupport amplía org.springframework.orm.hibernate3.support.HibernateDaoSupport con un método Autowired que llama a setSessionFactory (sessionFactory). Por lo tanto, de manera predeterminada, las otras sesiones de dao están configuradas para que Spring las administre automáticamente ... ¿Estas múltiples "sesiones" impondrían problemas de rendimiento? – sloven

2

Puede combinar Spring/Hibernate with JPA, que proporciona el EntityManager para una gran cantidad de tareas básicas de persistencia:

@Service 
public class CarService { 

    @PersistenceContext 
    private EntityManager em; 

    public void saveCarAndLease(Car car, Lease lease) { 
     em.persist(car); 
     em.persist(lease); 
    } 
} 

También manejará transacciones y consultas simples sin necesidad de escribir un DAO. Para las operaciones más complejas, aún puede escribir un DAO y recurrir a SessionFactory de Hibernate (aunque JPA también es una opción).

Algunos tutoriales sugieren que todavía debe escribir el DAO para la abstracción de la tubería JPA. Sin embargo, personalmente he encontrado que esto es innecesario (JPA tiene una huella de integración muy pequeña), y de hecho esta es también la forma en que Spring Roo trata la capa de datos detrás de las escenas.

1

Ha intentado utilizar Spring Data. Me refiero a decir Spring JPA donde puedes usar repositorios.
Puede eliminar la escritura de todo para cada entidad.

Cuestiones relacionadas