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.
fuente
Respuestas:
En mi experiencia, el típico proyecto empresarial nunca cambia:
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.
fuente
¿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.
fuente
Desde mi experiencia: no, no vale la pena en caso de JPA / Hibernate.
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 .
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.
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.
fuente
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.
fuente
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.
fuente