miércoles, 26 de marzo de 2008

Pasando a Hibernate Annotations en Flex

Siguiendo con la línea del post anterior, faltaría ver cómo quedan las clases anotadas con la metadata de persistencia, en particular me refiero a los NamedQueries que necesita el HibernateAssembler para invocar el método fill. La idea es agregar los named queries como anotaciones antes o después de la definición de la clase en el fuente java de la entidad, por ejemplo:
package samples.contacts;

import ...

@NamedQueries({
@NamedQuery(name="all",query="From Contact"),
@NamedQuery(name="all-active",query="From Contact c where c.active = true")
})

@Entity
public class Contact {...}

martes, 25 de marzo de 2008

Usando Flex con Hibernate/EJB3 Annotations

Al investigar el HibernateAssembler de Adobe vi que requiere los horrendos xml mappings y, como no me gusta perder el tiempo con etapas superadas me tomé el trabajo de hacer mi propio assembler para usar LifeCycle Data Services (antes conocido como Flex Data Services o FDS) con las entidades o pojos java y las anotaciones de persistencia, y fue mas fácil de lo que creí, primero pensé que iba a tener que crear un Assembler desde cero implementando AbstractAssembler, pero la cosa fue simple, tocando lo mínimo necesario, casi de cirujano, lo único que tuve que hacer fue extender la clase flex.data.assemblers.HibernateAssembler de Adobe y sobrescribir el método createHibernateConfiguration para que en vez de devolver un objeto org.hibernate.cfg.Configuration devuelva un org.hibernate.cfg.AnnotationConfiguration, va la receta completa:

1) Crear nueva clase AnnotationHibernateAssembler que extienda a flex.data.assemblers.HibernateAssembler

2) Sobrescribir método createHibernateConfiguration para devolver org.hibernate.cfg.AnnotationConfiguration (sin cambiar la firma del método)

3) Agregar/actualizar los siguientes jars al lib del webapp:

hibernate-annotations.jar (version 3.3.0 GA)
hibernate-commons-annotations.jar (version 3.3.0 GA)
ejb3-persistence.jar (version 3.3.0 GA)
hibernate3.jar (actualizar a version 3.2.5)

4) Indicar el nuevo assembler modificando el del en archivo data-management-config.xml

5) Borrar los horribles *.hbm.xml y volver a usar anotaciones

Acá adjunto el código de la clase:

/**
* Extiende el hibernate asembler de Adobe para usar las anotaciones de hibernate/ejb3
* como metadata y evitar la necesidad de crear los archivos *.hbm.xml de mapeo
*
* @author Claudio Fainschtein
*
* @see
* HibernateAssembler,
* Configuration,
* AnnotationConfiguration
*
*/
public class AnnotationHibernateAssembler extends flex.data.assemblers.HibernateAssembler
{
/**
* Sobreescribe metodo de clase HibernateAssembler que devuleve objeto
* configuración simple para devolver uno que toma las anotaciones específicas
* de hibernate y ejb3 como metadata para el ORM
*
*/
protected Configuration createHibernateConfiguration(String hibernateConfigFile)
{
AnnotationConfiguration hibernateConfig = new AnnotationConfiguration();
if (hibernateConfigFile == null)
{
hibernateConfig.configure();
}
else
{
hibernateConfig.configure(hibernateConfigFile);
}
hibernateConfig.buildSessionFactory();
return hibernateConfig;
}
}

Directo al grano

No voy a perder mucho tiempo con posts inaugurales o pavadas del estilo, solo voy a comentar que trabajo en temas de desarrollo desde hace mucho tiempo y mi mayor tesoro es que a pesar de los años no dejo de ser un terrible inquieto buscando nuevas técnicas y tecnologías no para joder sino con fines prácticos y orientados al negocio y la eficiencia, vale la pena invertir (no perder) un poco de tiempo en hacer mejor las cosas cada día, por lo que este post se termina ya para leer algo mas útil en el siguiente.