Modelos Dinámicos con Hibernate, Parte I
En las últimas versiones de Hibernate (3.3.x) se incluye el concepto de modelos dinámicos. Este concepto nos permite definir entidades sin necesidad de tener una clase (POJO) que la represente, es decir simplemente se tiene que carga la definición de la entidad (cargar el archivo hbm.xml o el DOM que lo represente).
Por ejemplo: Al cargar la siguiente definición:
<class entity-name="Customer" table="CUSTOMER">
<id name="id" type="long" column="ID">
<generator class="sequence"/>
</id>
<property name="name" column="NAME" type="string"/>
<property name="address" column="ADDRESS" type="string"/>
<many-to-one name="organization" column="ORGANIZATION_ID" class="Organization"/>
<bag name="orders" inverse="true" lazy="false" cascade="all">
<key column="CUSTOMER_ID"/>
<one-to-many class="Order"/>
</bag>
</class>
Se podría ejecutar el siguiente código:
Session s = openSession();
Transaction tx = s.beginTransaction();
// Create a customer
Map david = new HashMap();
david.put("name", "David");
// Create an organization
Map foobar = new HashMap();
foobar.put("name", "Foobar Inc.");
// Link both
david.put("organization", foobar);
// Save both
s.save("Customer", david);
s.save("Organization", foobar);
tx.commit();
s.close();
Este tipo de características nos permite mantener un modelo que puede ser modificado en tiempo de ejecución, pero si hay que tener en cuenta algunos posibles problemas:
— La carga de la configuración es una tarea muy pesada y al modificar la definición (mapping) de una entidad se tiene que volver a cargar la configuración. (configuration.buildSessionFactory)
— Es muy recomendable tener varios SessionFactory que agrupen entidades en común para disminuir el tiempo de carga de la configuración. Para lograr esto se tiene crear un objeto tipo Configuration en el cual se incluyan solo las entidades en común.
http://www.hibernate.org/171.html
Por ejemplo: Al cargar la siguiente definición:
<class entity-name="Customer" table="CUSTOMER">
<id name="id" type="long" column="ID">
<generator class="sequence"/>
</id>
<property name="name" column="NAME" type="string"/>
<property name="address" column="ADDRESS" type="string"/>
<many-to-one name="organization" column="ORGANIZATION_ID" class="Organization"/>
<bag name="orders" inverse="true" lazy="false" cascade="all">
<key column="CUSTOMER_ID"/>
<one-to-many class="Order"/>
</bag>
</class>
Se podría ejecutar el siguiente código:
Session s = openSession();
Transaction tx = s.beginTransaction();
// Create a customer
Map david = new HashMap();
david.put("name", "David");
// Create an organization
Map foobar = new HashMap();
foobar.put("name", "Foobar Inc.");
// Link both
david.put("organization", foobar);
// Save both
s.save("Customer", david);
s.save("Organization", foobar);
tx.commit();
s.close();
Este tipo de características nos permite mantener un modelo que puede ser modificado en tiempo de ejecución, pero si hay que tener en cuenta algunos posibles problemas:
— La carga de la configuración es una tarea muy pesada y al modificar la definición (mapping) de una entidad se tiene que volver a cargar la configuración. (configuration.buildSessionFactory)
— Es muy recomendable tener varios SessionFactory que agrupen entidades en común para disminuir el tiempo de carga de la configuración. Para lograr esto se tiene crear un objeto tipo Configuration en el cual se incluyan solo las entidades en común.
http://www.hibernate.org/171.html
0 comentarios