¿Qué ORM de Java prefieres y por qué? [cerrado]
Es una pregunta bastante abierta. Comenzaré un nuevo proyecto y buscaré diferentes ORM para integrarlos con el acceso a la base de datos.
¿Tienes algún favorito? ¿Hay alguno que recomendarías evitar?
Dejé de usar ORM.
La razón no es ningún gran defecto en el concepto. Hibernar funciona bien. En cambio, descubrí que las consultas tienen poca sobrecarga y puedo incluir mucha lógica compleja en consultas SQL grandes y trasladar gran parte de mi procesamiento a la base de datos.
Así que considere usar simplemente el paquete JDBC.
Ninguno, porque tener un ORM quita demasiado control con pequeños beneficios. El ahorro de tiempo obtenido se pierde fácilmente cuando hay que depurar anomalías resultantes del uso del ORM. Además, los ORM disuaden a los desarrolladores de aprender SQL y cómo funcionan las bases de datos relacionales y utilizarlo para su beneficio.
Muchos ORM son excelentes, necesita saber por qué desea agregar abstracción además de JDBC. Puedo recomendarte http://www.jooq.org (descargo de responsabilidad: soy el creador de jOOQ, por lo que esta respuesta está sesgada). jOOQ adopta el siguiente paradigma:
- SQL es algo bueno. Muchas cosas se pueden expresar bastante bien en SQL. No es necesario realizar una abstracción completa de SQL.
- El modelo de datos relacionales es algo bueno. Ha demostrado ser el mejor modelo de datos de los últimos 40 años. No hay necesidad de bases de datos XML ni de modelos de datos verdaderamente orientados a objetos. En cambio, su empresa ejecuta varias instancias de Oracle, MySQL, MSSQL, DB2 o cualquier otro RDBMS.
- SQL tiene una estructura y una sintaxis. No debe expresarse utilizando concatenación de cadenas de "bajo nivel" en JDBC, o concatenación de cadenas de "alto nivel" en HQL, las cuales son propensas a contener errores de sintaxis.
- La vinculación de variables tiende a ser muy compleja cuando se trata de consultas importantes. ESO es algo que debería abstraerse.
- Los POJO son excelentes para escribir código Java manipulando datos de bases de datos.
- Los POJO son difíciles de escribir y mantener manualmente. La generación de código es el camino a seguir. Tendrá consultas seguras para la compilación, incluida la seguridad del tipo de datos.
- La base de datos es lo primero. Si bien la aplicación en la parte superior de su base de datos puede cambiar con el tiempo, la base de datos en sí probablemente durará más.
- Sí, tiene procedimientos almacenados y tipos definidos por el usuario (UDT) en su base de datos heredada. Su herramienta de base de datos debería admitir eso.
Hay muchos otros buenos ORM. Especialmente Hibernate o iBATIS tienen una gran comunidad. Pero si buscas uno intuitivo y sencillo, te recomiendo que pruebes jOOQ. ¡Te encantará! :-)
Mira este ejemplo de SQL:
// Select authors with books that are sold out
SELECT *
FROM T_AUTHOR a
WHERE EXISTS (SELECT 1
FROM T_BOOK
WHERE T_BOOK.STATUS = 'SOLD OUT'
AND T_BOOK.AUTHOR_ID = a.ID);
Y cómo se puede expresar en jOOQ:
// Alias the author table
TAuthor a = T_AUTHOR.as("a");
// Use the aliased table in the select statement
create.selectFrom(a)
.whereExists(create.selectOne()
.from(T_BOOK)
.where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
.and(T_BOOK.AUTHOR_ID.equal(a.ID))))));
Hibernate, porque es básicamente el estándar de facto en Java y fue una de las fuerzas impulsoras en la creación de JPA. Tiene un soporte excelente en Spring y casi todos los marcos de Java lo admiten. Finalmente, GORM es un envoltorio realmente genial para hacer buscadores dinámicos y demás usando Groovy.
Incluso se ha portado a .NET (NHibernate) para que puedas usarlo allí también.
Hibernar, porque:
- es estable: ha existido durante tantos años y carece de problemas importantes
- dicta los estándares en el campo ORM
- implementa el estándar (JPA), además de dictarlo.
- Tiene toneladas de información al respecto en Internet. Hay muchos tutoriales, soluciones a problemas comunes, etc.
- es poderoso: puede traducir un modelo de objetos muy complejo en un modelo relacional.
- Tiene soporte para cualquier RDBMS grande y mediano.
- Es fácil trabajar con él, una vez que lo aprendes bien.
Algunos puntos sobre por qué (y cuándo) usar ORM:
- trabaja con objetos en su sistema (si su sistema ha sido bien diseñado). Incluso si usa JDBC, terminará creando alguna capa de traducción para transferir sus datos a sus objetos. Pero apuesto a que la hibernación es mejor para traducir que cualquier solución personalizada.
- no te priva del control. Puede controlar las cosas con detalles muy pequeños y, si la API no tiene alguna función remota, ejecute una consulta nativa y la tendrá.
- cualquier sistema de tamaño mediano o grande no puede permitirse el lujo de tener una tonelada de consultas (ya sea en un solo lugar o dispersas), si pretende ser mantenible
- si el rendimiento no es crítico. Hibernar añade una sobrecarga de rendimiento, que en algunos casos no se puede ignorar.