Mapeo XML
Nota que esta es una funcionalidad experimental en Hibernate 3.0 y está
bajo un desarrollo extremadamente activo.
Trabajando con datos XML
Hibernate te permite trabajar con datos XML persistentes en casi la misma forma
que trabajas con POJOs persistentes. Un árbol XML analizado (parsed) puede ser
pensado como sólo otra forma de representar los datos relacionales a nivel de objetos,
en vez de POJOs.
Hibernate soporta dom4j como API para manipular árboles XML. Puedes escribir
consultas que traigan árboles dom4j de la base de datos y tener cualquier modificación
que hagas al árbol sincronizada automáticamente a la base de datos. Puedes incluso tomar
un documento XML, analizarlo usando dom4j, y escribirlo a la base de datos con cualquiera
de las operaciones básicas de Hibernate: persist(), saveOrUpdate(), merge(),
delete(), replicate() (la fusión no está aún soportada).
Esta funcionalidad tiene muchas aplicaciones incluyendo la importación/exportación de datos,
externalización de datos de entidad vía JMS o SOAP y reportes basados en XSLT.
Un solo mapeo puede ser usado para mapear simultáneamente las propiedades de una clase y los nodos de un
documento XML a la base de datos, o, si no hay ninguna clase a mapear, puede ser usado para mapear sólo
el XML.
Especificando los mapeos de XML y de clase juntos
He aquí un ejemplo de mapear un POJO y XML simultáneamente:
...
]]>
Especificando sólo un mapeo XML
He aquí un ejemplo donde no hay ninguna clase POJO:
...
]]>
Este mapeo te permite acceder a los datos como un árbol dom4j, o como un grafo de pares nombre/valor de
propiedad (Maps de Java). Los nombres de propiedades son construcciones puramente
lógicas a las que se puede hacer referencia en consultas HQL.
Mapeo de metadatos XML
Muchos elementos de mapeo de Hibernate aceptan el atributo node. Esto te permite espcificar
el nombre de un atributo o elemento XML que contenga los datos de la propiedad o entidad. El formato del
atributo node debe ser uno de los siguientes:
"element-name" - mapea al elemento XML mencionado
"@attribute-name" - mapea al atributo XML mencionado
"." - mapea al elemento padre
"element-name/@attribute-name" -
mapea al atributo mencionado del elemento mencionado
Para las colecciones y asociaciones monovaluadas, existe un atributo adicional embed-xml.
Si embed-xml="true", que es el valor por defecto, el árbol XML para la entidad
asociada (o colección de tipo de valor) será embebida directamente en el árbol XML para la entidad que
posee la asociación. En otro caso, si embed-xml="false", sólo el valor identificador
referenciado aparecerá en el XML para asociaciones de punto único y para las colecciones simplemente
no aparecerá en absoluto.
¡Debes ser cuidadoso de no dejar embed-xml="true" para demasiadas asociaciones,
ya que XML no trata bien la circularidad!
...
]]>
en este caso, hemos decidido embeber la colección de ids de cuenta, pero no los datos reales de cuenta.
La siguiente consulta HQL:
devolvería conjuntos de datos como estos:
987632567
985612323
Gavin
A
King
...
]]>
Si estableces embed-xml="true" en el mapeo <one-to-many>, los datos
podrían verse así:
100.29
-2370.34
Gavin
A
King
...
]]>
Manipulando datos XML
Vamos a releer y actualizar documentos XML en la aplicación. Hacemos esto obteniendo una sesión dom4j:
Es extremadamente útil combinar esta funcionalidad con la operación replicate()
de Hibernate para implementar la importación/exportación de datos basada en XML.