Hibernate mola.
Permite que hasta alguien como yo funcione con una base de datos sin necesidad (a priori, y si no queremos cosas demasiado raras) de saber absolutamente nada de SQL. Es lo más de lo más en ORMs.
“Yo sé de objetos, y con eso me debe bastar” es la filosofía subyacente. Básicamente, con unos estupendos ficheros XML se configura cómo mapeamos las tablas de la base de datos a los objetos (ValueObjetcs dentro del patrón DAO-VO) que queremos manejar; indicando qué campo(s) es(son) la PK, y estableciendo una relación entre cada campo de la tabla y cada campo del objeto (nombre de uno, nombre de otro y tipo [string, número, etc...]). Por supuesto, se pueden establecer relaciones 1-1, 1-n, n-1 y n-m entre las tablas que estamos mapeando, de manera que, por ejemplo, cuando consultemos un registro de una tabla, nos devuelva, de una vez y eliminando el problema de las 1+n consultas, todos los hijos de ese registro en otra tabla (en un Set asociado, por ejemplo).
Pero como no sólo de resultados vive el programador, los objetos también se usan para realizar las propias consultas. Lejos quedan las ataduras al “select * from” y del “left join on”, ahora lo que se lleva es hacer una Criteria con un Example, y como te das cuenta de que todo puede manejar un Object y un .class, pues te haces tu clase “base” para realizar todas las consultas sobre cualquier tabla mapeada con un sólo método. TOMA! Chúpate esa SQL!
Ya – pensaréis algunos – ¿y qué pasa si tengo que hacer un count, un distinct o una referencia a sysdate/now/… ? Pues nada, tiras de Projections, que para eso están, o tiras de un nivel de abstracción menor que te permite Hibernate: HQL.
HQL está en medio de los objetos puros y duros de Hibernate y el string puro y duro de una SQL. Así pues, sólo podía ser un string con objetos. Es decir, algo como: “from MiObjetoMapeado where campoFecha > sysdate”.
Donde seguimos sin necesitar saber (casi) nada de SQL, salvo, tal vez, que en lugar de tirar un (new Date()) tenemos que usar un sysdate para este ejemplo.
Y es que las expresiones que se pueden usar en una HQL son prácticamente todo lo que necesitas, como una buena navaja suiza. Puedes hacer cosas tan chulas como algo así:
hql += ” and (“+duracion+” between substr(duracion,0, instr(duracion, ‘-’)-1) and substr(duracion, instr(duracion, ‘-’)+1) or duracion is null)”;
NOTA: Un sugus para quien comente qué estamos comparando con qué en esta cláusula where.
Pero como no todo se puede hacer, por ejemplo, que sé que lo tenéis en mente, llamar a una función que has hecho dentro de la base de datos para que te calcule algo internamente, algo como “select miFuncion(campo1) from tabla1″, pues nada, Hibernate también te deja ejecutar una SQL tal cual, como siempre, aunque tendrás que hacer algo más para parsear el resultado a un objeto tuyo…
… claro que siempre puedes incluir esta sentencia como una fórmula de un objeto mapeado, de manera que no necesites realmente tirar una fea SQL de esas que tan poco le gustan (o pueden llegar a gustarle) al responsable de cambiar Oracle por PostgreSQL o MySQL por SqlServer.
Porque la gracia de todo esto, además de facilitar el acercamiento del programador orientado a objetos al maravilloso mundo de las bases de datos, es hacer independiente, todo lo que permita la lógica de la aplicación que estemos desarrollando, de la base de datos.
Todo sea para que el MVC sea realmente MVC, y separemos las capas para aprovechar toda la flexibilidad que podamos sacar para adaptarnos a los futuros cambios que seguro nos pedirán…
… pero eso, como en el final de Conan, “it’s another story…”









Hibernate mola mas cuando en vez de xml, defines tus objetos mediante anotaciones.
Yes my friend, pero eso irá después del de Conan
Además, ya se trató en este gran post de Daisy.
La idea era no mostrar Hibernate, sino proponer la hql que ha llevado nuestros límites de hql hasta cumbres insospechadas.
Salu2!
[...] http://blog.theinit.com/2011/07/06/criterias-hqls-y-sqls-al-fin/ July 6, 2011 // SQL // No Comments // [...]
Lo difícil de estas herramientas es el “¿Donde está qué cosa?”, lo mismo que pasa con Groovy y Grails por ejemplo.
Mi pregunta, ¿es complejo aprender a usar este tipo de herramientas?
Que vaaaaa, muy fácil, y con anotaciones, como apuntan, mucho más sencillo. Eso sí, yo soy más de que lo cuenten a tener que digerirlo yo solito, pero eso al gusto. El enlace al post en el que lo explican junto con Spring es un buen inicio.
No me parece más complicado que MyBatis, por ejemplo, y es mucho más potente.
Salu2