¿Realmente vale la pena mantener la implementación agnóstica?

22

Tengo un proyecto en el que estoy trabajando actualmente usando Tomcat, Spring 4, Spring Security, MySQL y JPA con Hibernate.

Elegí JPA desde el punto de vista de que se supone que hacer que el intercambio de la implementación subyacente de los proveedores de ORM sea perfecto, o al menos menos doloroso. Diría que esto es usar mentalmente la especificación sobre la implementación (JAX-RS) es el punto de vista predeterminado de la comunidad de desarrollo de Java.

Tengo curiosidad por saber si esta es realmente una tarea que vale la pena hacer. Estoy seguro de que si usara Hibernate directamente, ganaría algo de energía porque podría usar funciones que no son parte de la especificación JPA principal.

Parte de mi preocupación proviene de la idea de YAGNI. Básicamente estoy programando en un estilo y moda específicos (usando JPA en lugar de Hibernate) para que en algún momento en el futuro pueda cambiar mi implementación de ORM. Dudo mucho que eso suceda durante la vida útil del producto, por lo que esencialmente estoy poniendo esfuerzo en algo de lo que probablemente nunca cosecharé los beneficios.

¿Cuáles son tus pensamientos? ¿Vale la pena "programar en la interfaz" cuando se trata de cosas como JPA? ¿Alguna vez ha intercambiado una implementación ORM completa en un producto? ¿Alguna vez has podido evitar por completo la abstracción de algo como la filtración de JPA de todos modos? Personalmente, ya tengo una sola llamada SQL nativa (para limpiar las tablas de la base de datos), y hay algunas cosas con las que me gustaría hablar que están integradas en la especificación JPA (obtener / establecer prefijos para sus métodos, y la diferencia entre MEMBER OF / IN, que solo vincularme a una implementación subyacente me dará alguna posibilidad de evitar.

Jazzepi
fuente
¿Pruebas unitarias? Cambiar implementaciones no necesariamente significa producto terminado.
MrDosu

Respuestas:

26

para que en algún momento en el futuro pueda cambiar mi implementación de ORM. Dudo mucho que eso suceda durante la vida útil del producto, por lo que esencialmente estoy poniendo esfuerzo en algo que probablemente nunca coseche los beneficios de

En mi experiencia, el típico proyecto empresarial nunca cambia:

  1. Base de datos
  2. ORM
  3. Idioma

No sé los números, pero el porcentaje de aplicaciones de 2 niveles que he visto implementar y luego cambiar una de esas cosas probablemente sería inferior al 10%. Si sucede, es raro, y generalmente ocurre dentro de los primeros 2-3 meses del proyecto cuando las personas todavía están en modo de descubrimiento. La mayoría de los sistemas que conozco todavía se ejecutan en sus plataformas originales 8-10 años después.

Más a menudo que intercambiar un ORM, ¿quieres saber de qué he visto más? Eliminar el ORM por completo para desplegarlo a SQL debido a problemas de rendimiento. Así que no importa qué, en ese caso, vas a reescribir cosas.

En cuanto a la implementación agnóstica, es un mito. Realmente equivale a tontear. Entonces, mi enfoque es adoptar la capa de datos. Conviértalo en una parte de primera clase de su lenguaje y diseño. Hace proyectos más felices y exitosos.

Codenheim
fuente
3
Estoy totalmente de acuerdo, esta también es la base de la mayoría de los problemas que tengo con Hibernate en general: compromete el SQL que genera para facilitar el intercambio de la base de datos. También "hace un acceso" al suponer que es el mejor lugar para almacenar un caché de tabla, que rara vez es el caso de la OMI. Hay un caso para que Hibernate tenga una caída en los módulos de ajuste de SQL que convierten HQL en Oracle, MySQL, SQL Server, etc. SQL optimizado y dejan de hacer cosas estúpidas que RDBMS hace mejor.
mcottle
5

¿vale la pena?
Eso dependería completamente de la aplicación.
Si está escribiendo una solicitud interna para una sola empresa, olvídela. Esa base de datos sobrevivirá a la aplicación por años, posiblemente décadas.
A menos que, por supuesto, se le haya dado a entender desde el principio que la base de datos está planeada para ser reemplazada por algo más en el futuro cercano.
Si lo escribe para la venta a los clientes, que pueden tener diferentes motores de base de datos, Y los requisitos son tales que se supone que debe admitir múltiples motores de base de datos, ENTONCES tiene sentido.

Para la mayoría de las personas que escriben aplicaciones Java, es irrelevante.

jwenting
fuente
+1 por mencionar aplicaciones donde el soporte para múltiples DBMS es una característica. Si ofrece su aplicación para "autohospedaje" (algo que muchos clientes empresariales consideran deseable), es posible que lo necesite. Sin embargo, es probable que pueda seguir con un ORM.
sleske
4

Desde mi experiencia: no, no vale la pena en caso de JPA / Hibernate.

¿Vale la pena "programar en la interfaz" cuando se trata de cosas como JPA?

Lo es, pero no tiene nada que ver con JPA específicamente. Puede hacer "programación a las interfaces" de Hibernate. No se trata de ocultar un marco bajo un estándar, se trata de SÓLIDO .

¿Alguna vez ha cambiado una implementación ORM completa en un producto?

Si y no. Uno de los productos de nuestra compañía migró parcialmente de Hibernate a jOOQ (que no tiene nada que ver con JPA). No fue exactamente un "proyecto empresarial típico" que @codenheim mencionó, por lo que fue posible el intercambio.

No veo ningún punto de intercambiar Hibernate con otro ORM compatible con JPA.

¿Alguna vez has podido evitar por completo la abstracción de algo como la filtración de JPA de todos modos?

No. Es imposible porque tanto JPA como Hibernate son muy complejos. Y de todos modos tiene que lidiar con los problemas de rendimiento y los defectos de diseño de Hibernate.

scriptin
fuente
3

A riesgo de sonar contraria aquí, diría que sí, vale la pena. Y no lo es.

El problema no es tanto cambiar su ORM o proveedor de base de datos como tal. Es más una cuestión de separación de preocupaciones y mantenerse ágil.

Una vez que comienza a confiar en algunos detalles de implementación de una biblioteca, comienza a crear enredos de preocupaciones cada vez más profundos.

Si sabe que su implementación de ORM es Hibernate, este conocimiento comienza a filtrar toda la arquitectura de su aplicación. Y cada vez que aparece una nueva tecnología que desplaza a Hibernate o JPA tan a fondo como Hibernate hizo lo que sucedió antes, descubres que las dependencias se han vuelto mucho más profundas de lo que esperabas.

Es mucho mejor esconder toda la preocupación de persistir su modelo en algún lugar fuera del camino, donde el resto de la aplicación pueda ignorar fácilmente todas las complejidades de los tratos con bases de datos y transacciones y demás. En ese rincón oscuro remoto, puede unirse en nudos sobre detalles de implementación específicos si lo desea, ya no importa.

Roland Tepp
fuente
1

El problema con el agnosticismo de implementación es que, en su tiempo como desarrollador, perderá el tiempo de cualquier manera.

He escrito varios proyectos en los que perdimos una gran cantidad de tiempo escribiendo en una interfaz, que nunca se usaron de ninguna manera nueva, nunca se convirtieron y solo se usaron 'tal cual' durante años

También he perdido un montón de tiempo convirtiendo software que nadie esperaba que fuera necesario convertir.

La única observación real que tengo que hacer es que la primera es mucho menos dolorosa.

Jon Story
fuente