2011-02-24 13 views
63

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 hizo que fuera agradable y fácil de usar Hibernate con mis clases de dominio.¿Por qué no se recomienda HibernateDaoSupport?

Sin embargo, mientras buscaba una pregunta no relacionada, vi a alguien mencionar que el 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?

Respuesta

87

Usando HibernateDaoSupport/HibernateTemplate no es recomendable ya que innecesariamente lazos su código a la primavera clases.

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 transacciones gestionadas por Spring. Todo lo que necesita es configurar el soporte de transacciones de Spring, ingrese SessionFactory y llame al getCurrentSession() cuando necesite trabajar con la sesión.

Otro beneficio de HibernateTemplate es la traducción de excepción. Sin HibernateTemplate se puede lograr la misma funcionalidad utilizando la anotación @Repository, como se muestra en la respuesta de Gareth Davis.

Consulte también:

+0

Gracias por la entrada. Y gracias por el enlace al documento de Spring, en realidad está bastante claro. Marcaré su publicación como la respuesta ya que responde mis preguntas principales, gracias. – C0deAttack

+1

Como alternativa a 'SessionFactory', puede usar la implementación JPA 2 de Hibernate (inserte un' EntityManager' como punto de partida). – Jan

+4

Es importante tener en cuenta que Spring ha descartado HibernateDaoSupport/HibernateTemplate de su paquete Hibernate 4. Entonces, si utiliza estas clases ahora, tendrá que refactorizar algo cuando actualice a Hibernate 4. – SteveT

17

Para mi dinero no hay nada de malo en usar HibernateDaoSupport. No está en desuso en la primavera 3.0.

Puede proporcionarnos el número de pregunta que encontró, quizás estén refiriéndose a un caso de uso muy específico.

La alternativa es utilizar la anotación @Repository. Esto incluirá la misma traducción de excepción (uno de los grandes beneficios del HibernateTemplate) y le permitirá usar su propia superclase o simplemente evitar la ampliació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); 
    } 
} 
+4

+1 - yo prefiero '' HibernateDaoSupport' y HibernateTemplate', ya que proporcionan una API más rica que la hibernación prima 'API Session'. – skaffman

+0

Gracias por la sugerencia sobre la anotación de @Repository, sin duda encontraré más información al respecto en los documentos. No pude encontrar el hilo donde vi esta mención por primera vez, lo siento. – C0deAttack

+0

@skaffman bien si Hibernate tiene una API mala, entonces tal vez Hibernate no debería usarse (solo lo uso como proveedor de JPA) –

Cuestiones relacionadas