2008-09-19 48 views
28

Mis desarrolladores están librando una guerra civil. En un campamento, han abrazado Hibernate y Spring. En el otro campo, han denunciado los marcos, sin embargo, están considerando Hibernate.Java Frameworks War: Spring e Hibernate

La pregunta es: ¿hay sorpresas desagradables, debilidades o caídas que los nuevos novatos de Hibernate-Spring puedan tropezar?


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 ha cambiado en los últimos proyectos incluidos).

+2

Oh, hombre, odio cuando los proyectos degeneran en guerra. Ocurre con demasiada frecuencia a equipos con demasiados fanáticos. –

Respuesta

28

He usado Hibernate varias veces en el pasado. Cada vez que me he encontrado con casos extremos donde la determinación de la sintaxis se convirtió 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 que miré).

En cuanto a la primavera, casi todos los trabajos que he entrevistado a favor o miraba en los últimos años involucrados primavera, se ha convertido realmente en el estándar de facto para Java/Web. Usarlo ayudará a sus desarrolladores a ser más comercializables en el futuro, y lo ayudará, 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 bueno en los resultados.

+2

Sea CUIDADO. Hibernate es extremadamente poderoso, pero también extremadamente complejo. Es posible que no necesite la complejidad de Hibernate, existen otras opciones para ORM como SQL Maps, etc. Estas pueden conectarse a Spring. Ver http://static.springframework.org/spring/docs/2.5.x/reference/orm.html para más detalles. – MetroidFan2002

+1

Los marcos de Spring y OCM agregan mucha complejidad y programación en archivos XML. Hay otros marcos que puede elegir para crear aplicaciones web sin escribir el suyo propio. Los contenedores OSGi con gestión de componentes (por ejemplo, Apache Felix http://felix.apache.org) son mucho más simples y más flexibles que el estilo de Sling y los frameworks como Apache Sling (http://sling.apache.org) eliminar la necesidad de escribir Controladores y capas DAO adicionales por completo. –

39

Han denunciado marcos?

Eso es loco. Si no usa un marco comercial, entonces cree el suyo propio. Todavía es un marco.

+2

Supongo que exageré. Tal vez no denunciar ... más bien, se han resistido a la idea de adoptar los marcos en sus proyectos. – magius

5

No he trabajado mucho con Java, pero trabajé en grandes grupos de desarrolladores de Java. La impresión que tengo es que Spring está bien. Pero todos estaban molestos con Hibernate. Mitad del equipo si se le pregunta "Si pudieras cambiar una cosa, ¿qué cambiarías?" y dirían "Deshazte de Hibernate". Cuando comencé a aprender Hibernate me pareció increíblemente complejo, pero no aprendí lo suficiente (afortunadamente me he mudado) para saber si la complejidad estaba justificada o no (tal vez era necesario resolver algunos problemas complejos).

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

0

Los marcos no son malvados. incluso el SDK de Java es un marco.

Lo que probablemente lucha es la proliferación marco. No debería traer un marco a un proyecto solo por el momento, debería aportar un valor constante en un tiempo razonable. Cada marco requiere una curva de aprendizaje, pero debe recompensarlo con mayor productividad y características más adelante.

Si tiene dificultades con el código que es difícil de depurar debido al uso incoherente de la base de datos, mecanismos de caché complicados o una miríada de otras razones. Hibernate agregará un gran valor. aparte de la curva de aprendizaje (que me tomó aproximadamente 1 mes de trabajo práctico) no hubo ningún inconveniente, siempre que haya alguien cerca para explicarle los conceptos básicos.

16

Hibernate tiene ciertas peculiaridades, pero es porque el problema que está tratando de resolver es complejo. Cada vez que alguien se queja sobre Hibernate, les recuerdo todo el aburrido código DAO que tendrían que mantener si no lo estuvieran usando.

Algunos consejos:

  • Hibernate hay sustituto para un buen diseño de base de datos. Los esquemas de Hibernate son correctos, pero tendrá que modificarlos ocasionalmente
  • Eventualmente tendrá que entender cómo cargas perezosas de Hibernate y cómo afectan eso. Hibernate modifica el bytecode de Java y, tarde o temprano, tendrá que profundizar en las profundidades solo para explicar por qué los enlaces de objeto son nulos.
  • Use anotaciones si puede.
  • Tómese el tiempo para aprender las técnicas de ajuste de rendimiento de Hibernate, le ahorrará a largo plazo.
+0

¿Alguna opinión sobre Spring? – magius

+0

"Técnicas de ajuste de rendimiento de Hibernate" ¿Tiene algún recurso sobre eso? –

+0

Solo busqué en Google las "técnicas de ajuste de rendimiento de Hibernate" que arrojaron bastantes éxitos. Pero sí, como dijo Blade, ¿tienes algún recurso? – magius

3

He hecho un montón de desarrollo de Spring/Hibernate. Con el tiempo, la forma en que las personas usaban ambas 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 útiles; ¡habla directamente con la API de Hiberante!

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

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

0

@slim - Estoy con ustedes de nuevo esta mañana.

Parece un caso clásico de Síndrome no inventado aquí. Si no están interesados ​​en la primavera, deberían considerar otras opciones en lugar de crear su propio marco (ya sea que lo reconozcan o no). Guice viene a la mente como una posibilidad. También picocontainer. Hay otros por ahí, dependiendo de lo que necesita.

7

Si tiene una base de datos bastante compleja, Hibernate puede no ser para usted. En el trabajo, tenemos una base de datos bastante compleja con muchos datos, y Hibernate en realidad no nos funciona. Empezamos a usar iBATIS en su lugar. Sin embargo, conozco a muchas tiendas de desarrollo que usan Hibernate con éxito, y que hace mucho trabajo duro para usted, así que vale la pena considerarlo.

El resorte es una buena herramienta si sabe cómo usarlo correctamente.

Yo diría que los marcos son definitivamente una buena cosa, como han señalado otros, no desea reinventar la rueda. Spring contiene muchos módulos que significarán que no tendrás que escribir tanto código. ¡No sucumba al síndrome de "No se inventó aquí"!

2

En cuanto a Hibernate: una herramienta muy buena para la aplicación que trata con un esquema de base de datos que cambia rápidamente, una gran cantidad de tablas, realiza muchas operaciones CRUD simples. Los informes con consultas complejas involucradas son bastante menos manejados. Pero en estos casos prefiero mezclar en JDBC o consultas nativas. Entonces, para una respuesta corta: creo que el tiempo que pasé aprendiendo Hibernate es una buena inversión (dicen que cumple con los estándares EJB3.0 y JPA, también, pero eso no entró en la ecuación cuando lo evalué para mi personal utilizar).

En cuanto a la primavera ... ver The Bile Blog :)

Recuerde: los marcos no son silver bullets, pero usted no debe reinvent the wheel tampoco.

7

Esto es una cosa (podría recordar) en la que caí cuando estaba en mis días de Hibernate. Cuando elimina (varios) objetos secundarios de una colección (en una entidad padre) y luego agrega entidades nuevas a la misma colección en una transacción sin enrojecimiento en el medio, Hibernate hará "insertar" antes de "eliminar". Si la tabla secundaria tiene una restricción única en una de sus columnas, y está esperando que no la viole ya que ya ha borrado algunos datos (como yo), prepárese para frustrarse. foro Hibernate sugiere:

  1. Fue un defecto de diseño DB, rediseñar;
  2. enjuague (o confirme si lo hace) entre las eliminaciones y las inserciones;

No pude hacer las dos cosas, y termino ajustando la fuente de Hibernate y recompilando. Fue solo 1 línea de código. Pero el esfuerzo por encontrar esa línea equivale a aproximadamente 27 tazas de café y 3 noches de insomnio.

Este es sólo un ejemplo de los problemas y peculiaridades que podría terminar cuando se utiliza Hibernate sin verdadero experto en su equipo (experto: alguien con un conocimiento adecuado sobre la filosofía y el funcionamiento interno de Hibernate). Su problema, la solución, el litro de café y el conteo nocturno sin dormir pueden variar. Pero se entiende la idea.

+0

flushing no confirma, solo elimina los cambios que ha indicado para la transacción hasta el momento. Se activará si has confirmado automáticamente. –

+0

Un experto es exactamente lo que no tenemos. Estamos confiando mucho en internet (generalmente google) como un mentor sustituto. Votándote. – magius

1

Me parece realmente útil utilizar marcos bien conocidos como Hibernate porque se ajusta a su código en un molde específico, o una forma de pensar. Es decir, ya que estás usando Hibernate, escribes el 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.

Hay un inconveniente en esto, por supuesto. Antes de que te conviertas en un desarrollador de Hibernate, vas a descubrir que estás tratando de encajar un cuadrado en un agujero circular. Usted SABE lo que quiere hacer y cómo se suponía que debía hacerlo antes de que Hibernate entrara en escena, pero encontrar la forma de hacerlo de Hibernate puede llevar ... bastante tiempo.

Aún así, para las empresas que frecuentemente contratan consultores (que necesitan comprender una gran cantidad de código fuente en poco tiempo) o donde los desarrolladores inician sesión y lo abandonan frecuentemente, o donde simplemente no quieren apostar sus desarrolladores clave se quedarán para siempre y nunca cambiarán de trabajo, creo que Hibernate y otros marcos estándar son una idea bastante buena.

/as

5

siempre he encontrado a Hibernate a ser un poco más complejo y difícil de aprender. Pero como JPA (Java Persistence API) y EJB (Enterprise Java Beans) 3.0 ha existido por un tiempo, las cosas se han vuelto mucho más fáciles, prefiero anotar mis clases para crear mapeos a través de JavaDoc o XML. Consulte el support in Hibernate. La ventaja añadida es que es posible (pero no sin esfuerzo) cambiar el marco de la base de datos más adelante si es necesario. He usado OpenJPA con excelentes resultados.

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

En cuanto a Spring, tiene muchas características que me gustan, pero la cantidad de XML que se necesita para configurar significa que nunca lo usaré. En cambio, utilizo Guice y me encanta.

Para resumir, le mostraría a sus desarrolladores que dudan cómo Hibernate les hará la vida más fácil. En cuanto a Spring, verificaría seriamente si Guice es una alternativa viable y luego trataré de mostrar cómo Spring/Guice hace que el desarrollo sea mejor y más fácil.

+0

Acepto, no soy partidario de los marcos que requieren tanta configuración XML. Aunque Spring ha mejorado mucho en ese sentido, todavía no está libre de XML. Esta es una de las razones por las que hemos lanzado nuestro propio entorno fácil de aprender, con configuración casi nula, MVC construido sobre Guice: [geeMVC] (https://github.com/commerceboard/geemvc). ¿Por qué cuando ya hay tantos frameworks MVC por ahí? Consulte nuestra [motivación] (https://github.com/commerceboard/geemvc/wiki/Motivation-Behind-geeMVC) detrás de agregar otra. – michaeldd

0

Spring e Hibernate definitivamente hacen la vida más fácil. Comenzar con ellos puede llevar un poco de tiempo al principio, pero seguramente se beneficiará de ello más adelante. Ahora que el XML está siendo reemplazado por anotaciones, tampoco necesita escribir cientos de líneas de XML.

Es posible que desee considerar AppFuse para reducir su curva de aprendizaje: generar una aplicación, estudiarla y adaptarla, y listo.

7

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

Usted tendrá que leer el artículo Open Session in View para entender el problema y obtener una solución. Si está utilizando Spring, este blog article describe la solución de Spring para el problema de la sesión abierta en la vista.

1

Spring y Hibernate son marcos que son difíciles de dominar. Puede que no sea una buena idea usarlos en proyectos con plazos ajustados mientras aún intentas descubrir los marcos.

Los beneficios de los marcos son básicamente para tratar de proporcionar una plataforma que permita que los códigos sean consistentes. A partir de la experiencia, es recomendable que los desarrolladores tengan experiencia con los marcos en la configuración de las mejores prácticas.

Dependiendo del diseño de su solicitud y/o base de datos, también existen peculiaridades que tendrá que sortear para asegurar que los marcos no obstaculizan el rendimiento.

1

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

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

1

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. Hibernate sin Spring puede ser muy doloroso, pero los dos juntos son muy útiles.

Montaje posterior de un proyecto existente a ningún marco va a ser doloroso, pero el proceso de refactorización menudo tiene graves beneficios para el mantenimiento a largo plazo.

1

La respuesta superior menciona que Hibernate está poco 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, 'Java persistence with Hibernate' es una lectura obligada para cada usuario de Hibernate y muy completo.