tutorial - ¿Por qué no se recomienda HibernateDaoSupport?
por medio de qué soporta y facilita spring los dao cuando se utiliza hibernate (2)
He estado trabajando un poco con Hibernate 3.5 y Spring 3 recientemente, soy bastante nuevo con Hibernate y pensé que la clase HibernateDaoSupport
en Spring me permitió utilizar Hibernate de forma agradable y fácil con mis clases de dominio.
Sin embargo, mientras buscaba una pregunta no relacionada, vi a alguien mencionar que HibernateDaoSupport
no es la mejor manera de usar Spring e Hibernate. ¿Alguien puede arrojar algo de luz sobre:
- ¿Por qué no se recomienda?
- ¿Cuál es la mejor (o al menos aceptada) forma de integrar Hibernate y Spring?
No se recomienda utilizar HibernateDaoSupport
/ HibernateTemplate
ya que vincula innecesariamente su código a las clases de Spring.
El uso de estas clases era inevitable con las versiones anteriores de Hibernate para integrar el soporte de las transacciones gestionadas por Spring.
Sin embargo, desde Hibernate 3.0.1 ya no lo necesita más: puede escribir un código contra una API simple de Hibernate mientras usa las transacciones administradas por Spring. Todo lo que necesita es configurar el soporte de transacciones de Spring, inyectar SessionFactory
y llamar a getCurrentSession()
cuando necesite trabajar con la sesión.
Otro beneficio de HibernateTemplate
es la traducción de excepciones. Sin HibernateTemplate
la misma funcionalidad se puede lograr utilizando la anotación @Repository
, como se muestra en la respuesta de Gareth Davis.
Ver también:
Por mi dinero, no hay nada de malo en usar HibernateDaoSupport
. No está en desuso en la primavera 3.0.
¿Puede proporcionar el número de pregunta que encontró, tal vez se refieran a un caso de uso muy específico?
La alternativa es usar la anotación @Repository
. Esto incluirá la misma traducción de excepción (uno de los grandes beneficios de HibernateTemplate
) y le permitirá usar su propia superclase o simplemente evitar la extensión de una clase de marco de terceros.
@Repository
public class YourFooDao {
@Resource
private SessionFactory sessionFactory;
private Foo get(long id){
return (Foo) sessionFactory.getCurrentSession().get(id);
}
}