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.