2010-11-01 16 views
47

Saludos, Actualmente se está desarrollando una pequeña aplicación de servicio web donde la respuesta del servicio web (usando CXF + Spring) se procesa y guarda en la base de datos. Para trabajar con la base de datos, estoy usando Hibernate (3.5). Navegando por algún ejemplo de Hibernate + Spring en la web, a menudo puedo ver el uso de HibernateTemplate, así que estoy un poco confundido sobre este momento y quería preguntar:Plantilla de hibernación de primavera ¿cuándo y por qué?

¿Usas HibernateTemplate en tus aplicaciones Hibernate3? ¿Cuándo HibernateTemplate puede mejorar su vida de desarrollo y en función de qué puntos puedo decidir si debo usarlo o no?

Gracias.

Respuesta

50

Todas las plantillas de primavera (hibernación, JDBC, el descanso, la APP, etc.) tienen las mismas ventajas y desventajas:

Pro: que llevan a cabo las rutinas de configuración comunes para usted, deje que se salta el texto modelo y concentrarse en el lógica que quieras

Con: está acoplando su aplicación firmemente a la estructura de muelles. Por esta razón, Spring recomienda que ya no se use HibernateTemplate.

Específicamente, lo que HibernateTemplate hizo por usted fue abrir y cerrar sesiones automáticamente y comprometer o deshacer transacciones después de que se haya ejecutado su código. Sin embargo, todo esto se puede lograr de una manera orientada a aspectos utilizando Spring's Declarative Transaction Management.

Referencia:


Actualización:

A partir de Spring 3.1 (y versiones más recientes), HibernateTemplate has been removed. Ver Hibernate para los patrones de uso actualmente sugeridos.

+0

Gracias por los enlaces y por mencionar que HibernateTemplate no se recomienda ahora, creo que iré con la forma Declarative Transaction. – artjomka

+0

Buena idea. El enfoque de plantilla sigue siendo válido para REST, JMS, LDAP y posiblemente otros, pero para ORM, el enfoque transaccional es más potente y también más fácil. –

+13

Con el soporte Hibernate 4 de Spring 3.1, HibernateTemplate ya no es simplemente "no recomendado"; ha sido eliminado por completo. Consulte https://jira.springsource.org/browse/SPR-8096 – SteveT

4

HibernateTemplate encapsula una serie de cosas para hacer su vida más fácil.

Es su elección usarlo o no. Para el caso, puede trabajar con una base de datos sin Hibernate. El material de JDBC de Spring es muy bueno. Puede que le resulte más fácil resolver su problema sin tener que aprender Hibernate.

+0

De mediano a largo plazo, el uso de Hibernate es mucho más inteligente y más productivo. Seguir el avance de la respuesta anterior sería peligroso. Recomiendo aprender y usar Hibernate. –

+1

¿Peligroso? Ridículo. Creo que el comentario anterior es hilarante. Recomiendo usar la herramienta adecuada para el trabajo. – duffymo

+0

Se han iniciado muchos proyectos 'solo con JDBC, porque es más simple'. Sin embargo, debería haber comenzado con Hibernate, porque después de 2 semanas hubiera sido más eficiente. –

10

Permítanme aclarar una cosa que Spring's HibernateTemplate no será compatible en el futuro, eso significa que las versiones Hibernate 4+ no son compatibles con HibernateTemplate. Por lo tanto, se recomienda utilizar declarative transaction management según lo sugerido por Sean.

+0

. Consulte esto cuando esté leyendo la recomendación de Duffy de HibernateTemplate, BTW. Ni siquiera es compatible. –

+1

Cualquiera que lea esto debe tener en cuenta que vino DOS AÑOS después de mi respuesta original. La clarividencia no está en mi caja de herramientas. – duffymo

0

El patrón OpenSessionInViewFilter es efectivo. Esto abre una sesión de Hibernate & lo vincula a su hilo, durante el procesamiento de cada solicitud. OpenSessionInView también amplía la sesión y la capacidad de carga para visualizar la representación & de la capa de vista, lo que reduce la complejidad del acoplamiento & (al permitir que 'solo funcione').

Mis filosofías realmente no concuerdan con la gestión de transacciones declarativas basadas en aspectos. Me gusta hacer que los principales eventos de cambio de estado/ciclo de vida sean 'explícitos', ya que deben ser absolutamente definitivos, no dependen débilmente de múltiples capas ocultas & ocultas, que pueden funcionar o no.

Proporciona un punto para depurar en.

La confirmación de TX es solo una línea de código; pero es el más importante sobre el que quieres romper el punto. Ya no sintácticamente, que una declaración 'transaccional'; pero muchísimo más definido.

Francamente encuentro "comandos de usuario" o "solicitudes", que son el lugar adecuado para iniciar una transacción & transaccionalidad de control, debe estar bien estructurado, bien identificado & bastante explícito dentro de la aplicación.

(tuve problemas para conseguir las cosas aspecto de clase de carga de trabajo, tratando de que cuando salió por primera vez. Mi evaluación es que en comparación con el código OO bien escrito, aspecto sólo se ha limitado valor marginal.)

Consejo: Generalmente hago una clase de ayuda, para que sea realmente conveniente para obtener la sesión & para confirmar la transacción.

HbHelper o somesuch.

+1

-1 para las tonterías absolutas expresadas en "no depende débilmente de las capas mágicas de hadas aireadas, que pueden o no funcionar" – duffymo

+0

Avísame cuando puedas colocar un punto de interrupción en tu compromiso, @duffymo. También puedes decirle a los niños * cómo incluso comenzarías a depurar esto ... cuando las cosas no funcionaron perfectamente *. Y quizás también quiera explicar cómo la sintaxis declarativa es 'más corta' que escribir 'HbHelper.commit() ''. –

+0

No me malinterprete, puede haber argumentos a favor de esta tecnología. Pero, me gusta sopesar los pros y los contras reales. Y el código explícito, definitivamente es más confiable y más depurable. Sería tonto pensar lo contrario. –

0

Todas las plantillas estarán en desuso en el futuro. Es mejor usar el administrador de entidades, que es el estándar de JPA.

Cuestiones relacionadas