¿Por qué no se recomienda HibernateDaoSupport?

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:

  • 13.3.2 Implementación de DAO basados ​​en la API simple de Hibernate 3

Por mi dinero, no hay nada de malo en usar HibernateDaoSupport . No está en desuso en la spring 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); } }