Friday January 09, 2004
JavatadasBlog de Alvaro Zabala Hibernate Tricks
En nuestro proyecto estamos inmersos en el desarrollo de un servidor de datos espaciales (capas cartograficas).
Como estas cosas no te las dan las BBDD (o a nivel muy rudimentario, Oracle Spatial, PostGIS, etc), el servidor se hace necesario. Utilizar Hibernate con esta forma de trabajar era complicado. Hibernate esta basado en reflexion y en 1 clase - 1 tabla, pero para mi todas las capas cartograficas serán instancias de una misma clase (1 instancia - 1 tabla). ¿Por que? Cada vez que añada un origen de datos (capa rios, capa municipios, capa PGOU 2003, PGOU 2004, etc) no quiero tirar el servidor, hacer una nueva clase, mapearla y volverlo a levantar. En su lugar, tengo la clase Layer. Pero cada instancia tiene que tirar de una tabla (PGOU_2003, PGOU_2004, RIOS, etc), y esto se llevaba mal con Hibernate. Ademas, cada tabla tiene campos comunes (columna geometrica con la geometria guardada en binario) y campos diferentes. Por otro lado Hibernate te facilita la vida: transacciones, bloqueos, CRUD, caches en memoria, caches en disco, etc. La solucion: crear SessionFactory dinamicamente. Cada instancia tendra su propio SessionFactory, y cada SessionFactory tendra un mapeo distinto de la clase Layer, que apuntara a una tabla distinta. Ese mapeo se puede leer de la configuracion, generar dinamicamente, o estar en un fichero xml. Cada Layer tendra su xml distintos. El problema de que cada tabla tiene distintos campos se soluciona utilizando un [dynamic-component]. Es el equivalente Hibernate al Dynabean. En la clase se convierte en un Map, y tu en cada mapeo indicas las propiedades del component y el nombre de la columna de la tabla de donde las tiene que cojer. Ventajas: tengo todo lo que Hibernate me ofrece. Y no es poco. Hibernate me ha quitado meses de programacion a bajo nivel del tipo "SELECT FOR UPDATE", etc, etc. Ademas, si quiero añadir campos a las tablas lo puedo hacer sin tirar el servidor. Añadiendo un metodo para que se "refresque" el SessionFactory, este puede cambiar su mapeo en tiempo de ejecucion. Y el EHCache no veas como funcione. Macabo de ahorrar una de trabajo que no veas, si yo tuviera que hacer Caches multinivel (de memoria a disco), me hubiese muerto (pues a veces me interesan que las caches permanezcan al matar el servidor) Inconveniente: Hay que ver la memoria que consume el SessionFactory. Tardo muchisimo en arrancar el servidor, porque si tengo 100 Layers tengo que hacer 100 mapeos de SessionFactory. Eso me preocupa. El servidor es rapido en servir, las comunicaciones las controlo, tengo transacciones y muchas cosas mas (LifeCycle, etc, Gracias Hibernate!!!), pero tarda endemoniadamente en arrancar, y consume mucha memoria. Pero un SessionFactory por objeto es la unica forma que he encontrado de tener modelos dinamicos de objetos (este verano Al y yo comentamos el tema en nuestro blog) con Hibernate. SE ACEPTAN SUGERENCIAS!!!! (2004-01-09 19:35:01.0) Permalink Comentarios [2]
URL de la referencia: http://weblogs.javahispano.org/pacopaco/entry/hibernate_tricks
Enviar un comentario: |
Para saber mas... alvaro_zabala@hotmail.com Calendar
Links
NavigationReferersLas visitas de hoy a la página: 95 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Yo tengo un problema parecido, y la unica solucion que he encontrado es la misma que vosotros. Al menos, utilizando la version 2.1. Con la version 2.2 parece que todos nuestros problemas se solucionaran (http://www.mail-archive.com/hibernate-devel%40lists.sourceforge.net/msg03013.html). No he cacherreado todavia con el jar del branch 2.2. Quizas sea ya lo suficientemente estable para utilizarlo. En fin, espero que cuando me toque cambiar mi cutre motor de persistencia por Hibernate ya este estable la nueva version ;).
Enviado por Unknown en January 19, 2004 a las 03:06 AM EST #
Hola. Yo tengo el mismo problema en un framework que estoy desarrollando, y tampoco se me ha ocurrido otra solucion que utilizar multiples SessionFactory. Al menos con la version 2.1. Parece que la version 2.2 resolvera todos nuestros problemas (http://www.mail-archive.com/hibernate-devel%40lists.sourceforge.net/msg03013.html). No he cacharreado con el branch 2.2 o sea que no se si estara lo bastante estable para utilizarlo ya. Espero que cuando tenga que cambiar mi cutre motor de persistencia por Hibernate la 2.2 ya haya sido liberada :).
Enviado por rafael muñoz en January 19, 2004 a las 03:14 AM EST #