Hablando como alguien que pasó bastante tiempo trabajando con JPA (Java Persistence API, básicamente la API ORM estandarizada para Java / J2EE / EJB), que incluye Hibernate, EclipseLink, Toplink, OpenJPA y otros, compartiré algunos de mis observaciones
- Los ORM no son rápidos. Pueden ser adecuados y la mayoría de las veces es adecuado, pero en un entorno de alto volumen y baja latencia son un no-no;
- En lenguajes de programación de propósito general como Java y C #, necesita mucha magia para que funcionen (por ejemplo, tejido de carga en Java, instrumentación, etc.);
- Cuando utilice un ORM, en lugar de alejarse de SQL (que parece ser la intención), se sorprenderá de la cantidad de tiempo que pasa ajustando XML y / o anotaciones / atributos para que su ORM genere SQL con rendimiento;
- Para consultas complejas, realmente no hay sustituto. Al igual que en JPA, hay algunas consultas que simplemente no son posibles que están en SQL sin procesar y cuando tienes que usar SQL sin procesar en JPA no es bonito (C # /. Net al menos tiene tipos dinámicos, var, que es mucho mejor que una matriz de objetos);
- Hay muchas "trampas" cuando se usan ORM. Esto incluye un comportamiento involuntario o inesperado, el hecho de que tiene que construir la capacidad de realizar actualizaciones SQL en su base de datos (mediante el uso de refresh () en JPA o métodos similares porque JPA almacena en caché todo de manera predeterminada para que no capture una base de datos directa actualización: ejecutar actualizaciones directas de SQL es una actividad de soporte de producción común);
- El desajuste relacional de objetos siempre va a causar problemas. Con cualquier problema de este tipo, existe una compensación entre la complejidad y la integridad de la abstracción. A veces sentí que JPA fue demasiado lejos y alcanzó una ley real de rendimientos decrecientes donde la complejidad no estaba justificada por la abstracción.
Hay otro problema que requiere un poco más de explicación.
El modelo tradicional para una aplicación web es tener una capa de persistencia y una capa de presentación (posiblemente con servicios u otras capas intermedias, pero estas son las dos importantes para esta discusión). Los ORM fuerzan una vista rígida desde su capa de persistencia hasta la capa de presentación (es decir, sus entidades).
Una de las críticas a los métodos SQL más crudos es que terminas con todos estos VO (objetos de valor) o DTO (objetos de transferencia de datos) que se usan simplemente con una consulta. Esto se promociona como una ventaja de los ORM porque se deshace de eso.
La cuestión es que esos problemas no desaparecen con los ORM, simplemente se mueven hacia la capa de presentación. En lugar de crear VO / DTO para consultas, crea objetos de presentación personalizados, generalmente uno para cada vista. ¿Cómo es esto mejor? En mi humilde opinión no lo es.
He escrito sobre esto en ORM o SQL: ¿ Ya llegamos? .
Mi tecnología de persistencia de elección (en Java) en estos días es ibatis. Es un envoltorio bastante delgado alrededor de SQL que hace más del 90% de lo que JPA puede hacer (incluso puede hacer una carga diferida de las relaciones, aunque no está bien documentado) pero con mucho menos sobrecarga (en términos de complejidad y código real).
Esto surgió el año pasado en una aplicación GWT que estaba escribiendo. Mucha traducción de EclipseLink a objetos de presentación en la implementación del servicio. Si estuviéramos usando ibatis hubiera sido mucho más sencillo crear los objetos apropiados con ibatis y luego pasarlos de arriba a abajo de la pila. Algunos puristas podrían argumentar que esto es Bad ™. Tal vez sea así (en teoría), pero te digo qué: habría llevado a un código más simple, una pila más simple y más productividad.