¿Está Hibernate en su lecho de muerte?

Cada vez me disgusta menos Hibernate. Reconozco su tremenda utilidad y cuanto más tiempo paso intentando comprenderlo siento que poco a poco me amoldo a él. Sin embargo, nunca le he cogido cariño y mucho menos, me ha llegado a agradar lo suficiente. Si bien es el ORM preferido por la mayoría (incluyéndome a mi) tiene unas pegas muy frustrantes…

Partiendo de su consistencia antintuitiva para persistir los datos, prosiguiendo con su dificultad para optimizar las entidades y sus consultas, y finalmente desembocando en su terrible impresión de errores (obligándote a conocer sus entrañas a muy bajo nivel para debuguearlo), tiene las bases para ser un ORM muy frustrante, que se retroalimenta en sus fallos de diseño.

Sin embargo afirmaría con seguridad que este no es el motivo por el cual pienso que Hibernate puede estar muriendo. Y mi motivo principal es que el equipo de Red Hat ya no aporta prácticamente nada. Algunos de sus colaboradores más importantes se desvincularon del proyecto hace unos años, y ni siquiera los fundadores muestran interés por el repositorio. Y lo cierto es que la actividad del mismo duele de observar:

Lineas añadidas y eliminadas del código fuente de Hibernate por semana desde 2008

Actualmente, el repositorio de Hibernate tiene 204 pull requests abiertas, de las cuales 186 no tiene ninguna review. De las 18 restantes, tan solo 8 han sido aprobadas, 3 de ellas este año.

GitHub

¿A qué puede deberse esto? ¿Es posible que el formato de software libre en el que se basa RedHat no haya sido el adecuado para este proyecto que requiere mantenimiento y un mínimo de atención? Yo creo que no. Yo creo que Hibernate es un proyecto perfecto para ser open source, la comunidad se esfuerza en mejorar un producto que les recompensa directamente. Sin embargo, liderar y gestionar este esfuerzo de la comunidad requiere un tiempo, un tiempo que no les aporta un beneficio real de forma directa. Y esto es algo de lo que el quinto mayor contribuidor del proyecto habló hace un tiempo en esta curiosa conversación que tuvimos por Twitter:

Creo que hablo por todos cuando digo que Hibernate tiene mucho por mejorar, y que es una pena que nadie esté dispuesto a retomar el liderazgo de proyecto porque no haya forma de monetizarlo adecuadamente. ¿Es posible que un sistema de donaciones sea la clave que pudiera resucitar a Hibernate? Tarde o temprano es posible que pierda el liderazgo por parte de un shareware, o peor, un SaaS.

Mi experiencia colaborando

Finalmente me gustaría narrar la historia de cómo encontré lo que pensaba que era un bug que acabó siendo una «feature no implementada» y cómo intenté que se le prestara atención.

Sin entrar en detalle, yo quería usar el @JoinFormula en un campo @OneToMany en lugar de en un campo @ManyToOne, pero eso causaba un error (nada descriptivo, como de costumbre) al iniciar:

java.lang.ClassCastException: org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column

Estuve investigando en los foros y parece que incluso verdaderos gurús no se habían parado a pensar en que eso es una funcionalidad que muchos programadores iban a intentar usar. Incluso, se llegó a tirar el balón al techo de Spring:

Estaba equivocado, como demostró un trabajador de Spring. Sin embargo, a parte de arrogante, este hombre es sabio, pues su comentario anterior de ese mismo hilo parecía predecir su metedura de pata:

Tras tiempo de abrir una issue, y un periodo de debate, se llegó a la conclusión de que efectivamente, es una funcionalidad que debería existir y estar funcionando. Bien, primer paso logrado. Han pasado 7 años y un mes entre el primer debate conocido acerca del bug, y la decisión de solucionarlo. Es un buen paso, pero me temo que no estamos ni a la mitad del camino de ponerle una solución.

En 2018 se abre la tarea para solucionarlo en el backlog, pero lejos de que eso signifique planificar la tarea o añadirla en un roadmap, acabamos teniendo lo de siempre: la comunidad esforzándose por encontrar y documentar el fallo, y los autores ignorándola.

Decidí meterme más de lleno, y colaborar en el codigo. Como no tengo los conocimientos para implementar la característica decidí hacer algo a medio camino que tuviera al menos algo de valor; Asegurarme de que el error que se muestre no sea una traza inesperada de un código que no ha tenido en cuenta esa casuística. Y de paso crear un test con @FailureExpected para mantener el fallo en el punto de mira (ya que su Jira es un pozo sin fondo).

Creé esta simple pull request:

Todo el código de producción que modifiqué

Eso es todo, sin contar la clase de test, esas lineas son las únicas que tienen que ser revisadas. Pues bien, no ha recibido atención desde Abril de 2020.

Pues bien, creo que no puedo hacer más. Supongo que aquí acaba el intento de colaborar con una herramienta que tanto tiempo nos ahorra y desgraciadamente también nos hace perder.

Si tienes alguna opinión acerca de este delicado tema estaré encantado de que dejes un comentario. Un saludo, nos vemos pronto o tarde.

Un comentario

  1. Marcos García
    5 de abril, 2021
    Responder

    Buenas!
    Parece que tu PR ha generado un par de errores en los tests con Oracle… Quizá por eso no ha tenido más atención.
    Pero vamos, échale un galgo porque hay más tests que en el software de la NASA.

    Buen post! A mí Hibernate me da un poco de alergia porque es una bestia pesada y lenta. Para mi gusto es un ORM pensado para monolitos y yo soy más de microservicios.
    Si algún día te pones con Kotlin para backend, echa un vistazo a KTORM. Es un enfoque diferente al que tiene Hibernate y está más pensado para servicios ligeros.

    Un saludo!

Deja un comentario

Tu dirección de correo electrónico no será publicada.