Pregunta

Mis desarrolladores están librando una guerra civil.En un campo, adoptaron Hibernate y Spring.En el otro bando, han denunciado los frameworks; sin embargo, están considerando Hibernate.

La pregunta es:¿Hay sorpresas desagradables, debilidades o trampas con las que los novatos convertidos a Hibernate-Spring probablemente tropiecen?


PD:Tenemos una biblioteca DAO que no es muy sofisticada.Dudo que tenga la riqueza de Hibernate, pero está alcanzando algún tipo de madurez (es decir,no se ha modificado en los últimos proyectos en los que se incluye).

¿Fue útil?

Solución

He usado Hibernate varias veces en el pasado.Cada vez me he topado con casos extremos en los que determinar la sintaxis se convertía en una búsqueda del tesoro a través de la documentación, Google y versiones anteriores.Es una herramienta poderosa pero mal documentada (la última vez que miré).

En cuanto a Spring, casi todos los trabajos para los que he entrevistado o visto en los últimos años involucraban a Spring, realmente se ha convertido en el estándar de facto para Java/web.Usarlo ayudará a sus desarrolladores a ser más comercializables en el futuro y le ayudará a usted, ya que tendrá un gran grupo de personas que entenderán su aplicación.

Escribir su propio marco es tentador, educativo y divertido.No tan buenos resultados.

Otros consejos

han denunciado marcos?

Eso es una locura.Si no utiliza un marco estándar, cree el suyo propio.Sigue siendo un marco.

Sin duda, Hibernate tiene peculiaridades, pero eso se debe a que el problema que intenta resolver es complejo.Cada vez que alguien se queja de Hibernate, les recuerdo todo el aburrido código DAO que tendrían que mantener si no lo usaran.

Algunos consejos:

  • Hibernate no sustituye a un buen diseño de base de datos.Los esquemas de hibernación están bien, pero tendrás que modificarlos ocasionalmente.
  • Con el tiempo, tendrás que comprender cómo Hibernate carga las clases de forma diferida y cómo eso afecta las cosas.Hibernate modifica el código de bytes de Java y, tarde o temprano, necesitarás profundizar en las profundidades, aunque solo sea para explicar por qué los enlaces de objetos son nulos.
  • Utilice anotaciones si puede.
  • Tómese el tiempo para aprender las técnicas de ajuste del rendimiento de Hibernate; le ahorrará dinero a largo plazo.

Si tiene una base de datos bastante compleja, es posible que Hibernate no sea para usted.En el trabajo tenemos una base de datos bastante compleja con muchos datos y Hibernate realmente no nos funciona.En su lugar, comenzamos a usar iBATIS.Sin embargo, conozco muchos talleres de desarrollo que utilizan Hibernate con éxito, y hace mucho trabajo duro para usted, por lo que vale la pena considerarlo.

Spring es una buena herramienta si sabes cómo usarla correctamente.

Yo diría que los marcos son definitivamente algo bueno; como otros han señalado, no conviene reinventar la rueda.Spring contiene muchos módulos, lo que significará que no tendrás que escribir tanto código.¡No sucumbas al síndrome de "no inventado aquí"!

La carga diferida es el gran problema de las aplicaciones MVC que utilizan Hibernate para su marco de persistencia.Carga el objeto en el controlador y lo pasa a la vista JSP.Algunos o todos los miembros de la clase tienen proxy y todo explota porque su sesión de Hibernación se cerró cuando se completó el controlador.

Necesitarás leer el Abrir sesión en vista artículo para comprender el problema y obtener una solución.Si estás usando Spring, esto artículo de blog describe la solución Spring para el problema de sesión abierta en vista.

Esto es algo (lo puedo recordar) en lo que caí cuando estaba en mis días de Hibernación.Cuando elimina (varios) objetos secundarios de una colección (en una entidad principal) y luego agrega nuevas entidades a la misma colección en una transacción sin vaciar en el medio, Hibernate hará "insertar" antes de "eliminar".Si la tabla secundaria tiene una restricción única en una de sus columnas y espera no violarla porque ya eliminó algunos datos antes (como lo hice yo), entonces prepárese para sentirse frustrado.El foro de Hibernate sugiere:

  1. Fue un defecto de diseño de DB, un rediseño;
  2. vaciar (o confirmar si se quiere) entre las eliminaciones y las inserciones;

No pude hacer ambas cosas y terminé modificando la fuente de Hibernate y recompilando.Era solo 1 línea de código.Pero el esfuerzo por encontrar esa línea equivalía aproximadamente a 27 tazas de café y 3 noches de insomnio.

Este es sólo un ejemplo de los problemas y peculiaridades que pueden surgir al usar Hibernate sin un verdadero experto en su equipo (experto:alguien con conocimientos adecuados sobre la filosofía y el funcionamiento interno de Hibernate).Su problema, solución, litro de café y conteo de noches sin dormir pueden variar.Pero se entiende la idea.

No he trabajado mucho con Java, pero trabajé en grandes grupos de desarrolladores de Java.La impresión que tuve fue que la primavera está bien.Pero todo el mundo estaba molesto con Hibernate.La mitad del equipo si se le pregunta "Si pudieras cambiar una cosa, ¿qué cambiarías?" Y dirían "deshacerse de Hibernate".Cuando comencé a aprender Hibernate, me pareció sorprendentemente complejo, pero no aprendí lo suficiente (afortunadamente he avanzado) para saber si la complejidad estaba justificada o no (tal vez era necesaria para resolver algunos problemas complejos).

El equipo se deshizo de Spring en favor de Guice, pero eso fue más bien un cambio político, al menos desde mi punto de vista y el de otros desarrolladores con los que he hablado.

Siempre he encontrado que Hibernate es un poco complejo y difícil de aprender.Pero como APP (API de persistencia de Java) y EJB (Enterprise Java Beans) 3.0 existe desde hace un tiempo, las cosas se han vuelto mucho más fáciles, prefiero anotar mis clases para crear asignaciones a través de JavaDoc o XML.Revisar la soporte en hibernación.La ventaja adicional es que es posible (pero no sin esfuerzo) cambiar el marco de la base de datos más adelante si es necesario.He usado AbiertoJPA con grandes resultados.

Últimamente he estado usando JCR (Java Content Repository) cada vez más.Me encanta la forma en que mis módulos pueden compartir un único almacenamiento de datos y que puedo dejar que la estructura y las propiedades evolucionen.Me resulta mucho más fácil trabajar con nodos y propiedades que asignar mis objetos a una base de datos.Una buena implementación es Conejo.

En cuanto a Spring, tiene muchas características que me gustan, pero la cantidad de XML necesario para configurarlo significa que nunca lo usaré.En lugar de eso utilizo Guice y me encanta.

En resumen, les mostraría a los desarrolladores que dudan cómo Hibernate les hará la vida más fácil.En cuanto a Spring, comprobaría seriamente si Guice es una alternativa viable y luego intentaría mostrar cómo Spring/Guice hace que el desarrollo sea mejor y más fácil.

He desarrollado mucho en Spring/Hibernate.Con el tiempo, la forma en que la gente usaba ambos en combinación ha cambiado un poco.El enfoque original de HibernateTemplate ha demostrado ser difícil de depurar ya que traga y envuelve excepciones que de otro modo serían útiles;¡Habla directamente con la API de Hiberante!

Siga mirando el SQL generado (configure su registro de desarrollo para mostrar SQL).Tener una capa de abstracción para la base de datos no significa que ya no tengas que pensar en SQL;No obtendrás un buen rendimiento si no lo haces.

Considere el proyecto.Elegí iBatis en lugar de Hibernate en varias ocasiones en las que teníamos requisitos de rendimiento estrictos, esquemas heredados complejos o buenos bases de datos capaces de escribir SQL excelente.

En cuanto a Hibernar:una muy buena herramienta para aplicaciones que se ocupan de un esquema de base de datos que cambia rápidamente, una gran cantidad de tablas y realizan muchas operaciones CRUD simples.Los informes que implican consultas complejas se manejan bastante peor.Pero en este caso prefiero mezclar JDBC o consultas nativas.Entonces, para una respuesta breve:Creo que el tiempo dedicado a aprender Hibernate es una buena inversión (dicen que también cumple con los estándares EJB3.0 y JPA, pero eso no entró en la ecuación cuando lo evalué para mi uso personal).

En cuanto a la primavera...ver El blog de la bilis :)

Recordar:los marcos no son balas de plata, pero no deberías reinventar la rueda cualquiera.

Creo que es realmente útil utilizar marcos conocidos como Hibernate porque ajusta el código a un molde o forma de pensar específico.Es decir, dado que estás usando Hibernate, escribes código de cierta manera, y la mayoría, si no todos, los desarrolladores que conocen Hibernate podrán seguir tu línea de pensamiento con bastante facilidad.

Por supuesto, esto tiene una desventaja.Antes de convertirte en un destacado desarrollador de Hibernate, descubrirás que estás intentando encajar un cuadrado en un agujero circular.SABES lo que quieres hacer y cómo se suponía que debías hacerlo antes de que Hibernate entrara en escena, pero encontrar la forma en que Hibernate lo hiciera puede llevar...bastante tiempo.

Aún así, para las empresas que contratan consultores con frecuencia (que necesitan comprender una gran cantidad de código fuente en un corto período de tiempo) o donde los desarrolladores inician sesión y abandonan con frecuencia, o donde simplemente no quiere apostar a que sus desarrolladores clave quédese para siempre y nunca cambie de trabajo: creo que Hibernate y otros marcos estándar son una idea bastante buena.

/As

Spring e Hibernate son frameworks difíciles de dominar.Puede que no sea una buena idea usarlos en proyectos con plazos ajustados mientras todavía intentas descifrar los marcos.

Los beneficios de los marcos son básicamente intentar proporcionar una plataforma que permita que los códigos consistentes sean productos.Por experiencia, sería aconsejable contar con desarrolladores con experiencia en los marcos que establezcan las mejores prácticas.

Dependiendo del diseño de su aplicación y/o base de datos, también hay peculiaridades que deberá evitar para garantizar que los marcos no obstaculicen el rendimiento.

En mi opinión, la mayor ventaja de Spring es que fomenta y permite mejores prácticas de desarrollo, en particular acoplamiento flexible, pruebas y más interfaces.Hibernar sin Spring puede ser realmente doloroso, pero los dos juntos son muy útiles.

Actualizar un proyecto existente a cualquier marco será doloroso, pero el proceso de refactorización a menudo tiene importantes beneficios para la mantenibilidad a largo plazo.

Tengo que estar de acuerdo con muchas publicaciones sobre este.He usado ambos ampliamente en una variedad de entornos.Si pudiera deshacer una decisión de diseño, habría usado Hibernate.De hecho, presupuestamos un lanzamiento en uno de nuestros productos para cambiar Hibernate por iBatis y Spring-JDBC para lograr el mejor enfoque de todos los mundos.Puedo hacer que un nuevo desarrollador se ponga al día con Spring-JDBC, Spring-MVC, Spring-Ioc e iBatis más rápido que si simplemente les asignara Hibernate.

Hibernar es demasiado complicado para este desarrollador de KISS.Y que Dios le ayude con la hibernación si su DBA ve el SQL generado que ve la base de datos y le envía versiones optimizadas.

La respuesta principal menciona que Hibernate está mal documentado.Estoy de acuerdo en que el manual de referencia en línea podría ser más completo.Sin embargo, un libro escrito por los autores de Hibernate, 'Persistencia de Java con Hibernate' es una lectura obligada para todo usuario de Hibernate y muy completa.

@slim - Estoy contigo nuevamente esta mañana.

Suena como un caso clásico de Síndrome de no inventado aquí.Si no les interesa la primavera, deberían considerar otras opciones en lugar de implementar su propio marco (reconozca que lo ha hecho o no). Guice viene a la mente como una posibilidad.También picocontenedor.Hay otros disponibles, dependiendo de lo que necesites.

Spring e Hibernate definitivamente hacen la vida más fácil.Empezar a utilizarlos puede llevar un poco de tiempo al principio, pero sin duda te beneficiarás más adelante.Ahora que el XML está siendo reemplazado por anotaciones, tampoco es necesario escribir cientos de líneas de XML.

Quizás quieras considerar AppFuse para reducir su curva de aprendizaje:Genera una aplicación, estudíala, adáptala y listo.

Los marcos no son malos.Incluso el SDK de Java es un marco.

Lo que probablemente pelean es proliferación de marcos.No deberías incorporar un marco a un proyecto sólo por diversión, debería aportar un valor constante en un tiempo razonable.Cada marco requiere una curva de aprendizaje, pero debería recompensarlo con una mayor productividad y funciones más adelante.

Si tiene dificultades con un código que es difícil de depurar debido al uso inconsistente de la base de datos, mecanismos de caché complicados o muchas otras razones.Hibernar agregará un gran valor.Aparte de la curva de aprendizaje (que me llevó aproximadamente 1 mes de trabajo práctico), no hubo ningún problema, siempre que tengas a alguien cerca que te explique los conceptos básicos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top