jueves, junio 29, 2006

one-to-one with Hibernate

Cuando tiene una relación uno a uno en la BD, se supone que ambas tablas tiene la misma llave.
Cuando Hibernate hace el mapeo crea una relación one-to-one y como tienen la misma llave, ambas tablas deberian usar el mismo Objeto PK.
Tip: Solemos usar herramientas para generar los mapeos y las clases Java a partir de la BD que no saben identificar el escenario antes descrito (no conozco ningúna herramienta capaz), para no invertirle demasido tiempo a ésto basta con que en la clase hija (de la relación de BD) use la misma PK que la padre, y de la PK que se generó para la clase hija hacer que extienda de la clase PK del padre:
Ejemplo:
Padre en la BD:
name="mx.net.vladpax.java.hbm.Familia" table="IEC_SUBDELEGACION">
name="comp_id" class="mx.net.vladpax.java.hbm.FamiliaPK">
name="cveFamilia" column="CVE_FAMILIA" type="java.lang.Integer" length="2"/>
name="cveTipoFamilia" column="CVE_TIPO_FAMILIA" type="java.lang.Integer" length="2"/>

Hija en la BD:
name="mx.net.vladpax.java.hbm.CasaXFam" table="IEC_MPIO_XSUBDEL" >
name="comp_id" class="
mx.net.vladpax.java.hbm.FamiliaPK">
name="
cveFamilia" column="CVE_FAMILIA" type="java.lang.Integer" length="2"/>
name="
cveTipoFamilia" column="CVE_TIPO_FAMILIA" type="java.lang.Integer" length="2"/>
Si vemos tenemos la misma clase, en la hija la gerramienta me generó una llamada: 'CasaXFamPK' e identica a SubdelegacionPK
La cual modifique de la siguiente forma:

public class CasaXFamPK extends FamiliaPK {

La excepción provacada cuando caemos en el error de no usar la misma clase para relaciones one-to-one es:
exception getting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) getter of paquete.java..nombreClaseHijaPK.?; nested exception is org.hibernate.PropertyAccessException: exception getting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) getter of paquete.java.nombreClaseHijaPK.?

No hay comentarios.: