HIBERNATE - Relational Persistence for Idiomatic Java Hibernate Reference
HIBERNATE - jtech.ua.es · Especialista Universitario Java Enterprise Hibernate © 2006-2007 Depto....
Transcript of HIBERNATE - jtech.ua.es · Especialista Universitario Java Enterprise Hibernate © 2006-2007 Depto....
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos
Especialista Universitario Java Enterprise
HIBERNATE
Sesión 3: Relaciones entre objetos
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -2
Puntos a tratar• Persistencia transitiva• Composición• Herencia• Asociaciones
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -3
Persistencia transitiva• Nos permite propagar la persistencia a
subgrafos transient o detached de forma automática• Trabajamos con grafos de objetos debido a las
relaciones entre clases • Hibernate NO navega (por defecto) a través de
las asociaciones• Para "activar" la persistencia transitiva en
asociaciones:• Asignamos un valor a cascade distinto de "none"• cascade="all,delete-orphan" ⇒ Relación padre/hijo
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -4
Composición
Componente con dirección facturas
Componente con dirección personal
USER_ID <<PK>>USERNAME...CALLE_FACTURACOD_FACTURACIUDAD_FACTURACALLE_PERSCOD_PERSCALLE_PERS
<<Tabla>>USUARIO
nombre: Stringapellidos: Stringlogin: Stringclave: Stringemail: Stringtipo: intcreado: Date
Usuario
calle: StringcodPostal: Stringciudad: String
Direccionfacturas
personal
value type
entity type
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -5
Mapeado para la composición<class name="Usuario" table="USUARIO">
<id name="id" column="USER_ID" type="long"><generatorclass="native"/> </id>
<propertyname="nombre" column="USERNAME" type="string"/>
<component name="direccionPersonal" class="Direccion"><property name="calle" type="string"
column="CALLE_PERS" not-null="true"/> <property name="ciudad" type="string"
column="CIUDAD_PERS" not-null="true"/> <property name="codPostal" type="short"
column="COD_PERS" not-null="true"/> </component>
<component name="direccionFacturas" class="Direccion"> ...</component>
</class>
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -6
Herencia
propietario: Stringnumero: Stringcreada: Date
DetallesCuenta
tipo: intcaducMesl: StringcaducAnyo: String
Tarjeta
nombreBanco: Stringcif: String
CuentaBancaria
DET_CUENTA_ID <<PK>>PROPIETARIONUMEROCREADA
<<Tabla>>DETALLES_CUENTA
TARJ_CREDITO_ID <<PK>> <<FK>>TIPOCAD_MESCAD_ANYO
<<Tabla>>TARJETA_CREDITO
CTA_BANK_ID <<PK>> <<FK>>NOMBRECIF
<<Tabla>>CUENTA_BANCARIA
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -7
Mapeado para la herencia<hibernate-mapping>
<class name="DetallesCuenta" table="DETALLES_CUENTA"> <id name="id" column="DET_CUENTA_ID" type="long">
<generator class="native"/> </id> <property name="propietario" column="PROPIETARIO"
type="string"/> <joined-subclass name="Tarjeta" table="TARJETA_CREDITO">
<key column="TARJ_CRED_ID"/> <property name="tipo" column="TIPO"/>
... </joined-subclass> <joined-subclass name="CuentaBancaria" table="CUENTA_BANCARIA"> ... </joined-subclass>
</class> <hibernate-mapping>
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -8
Asociaciones• Las asociaciones en Hibernate son
inherentemente unidireccionales• Hibernate NO gestiona asociaciones
persistentes• Si una asociación es bidireccional, no importa la
multiplicidad, se deben considerar ambos extremos de la relación
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -9
Asociación many-to-one (unidireccional)Implementación Java
publicclass Puja{ ... private Articulo articulo;
public void setArticulo(Articulo articulo) { this.articulo = articulo; }
public Articulo getArticulo() { return articulo; }
... }
publicclass Articulo{ private Long id; ...
publicLong getId() { returnid; }
publicvoidsetId(Longid) { this.id = id; }
... }
PujaArticulo1..1 0..*
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -10
Asociación many-to-one (unidireccional)Mapeado Hibernate
<classname="Puja" table="PUJA"> <idname="id" column="PUJA_ID"> <generatorclass="native"> </id> ... <many-to-one name="articulo" column="ARTICULO_ID" class="Articulo"
not-null="true"/> </class>
<classname="Articulo" table="ARTICULO"> <idname="id" column="ARTICULO_ID"> <generator class="native"/> </id>
... </class>
ARTICULO_ID <<PK>> NOMBREDESCRIPCIONPRECIO_INICIAL
<<Tabla>>ARTICULO
PUJA_ID <<PK>> ARTICULO_ID <<FK>>CANTIDAD
<<Tabla>>PUJA
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -11
Asociación many-to-one (one-to-many) bidireccionalImplementación Java
publicclass Articulo{ ... private Set pujas = new HashSet();publicvoidsetPujas(Set pujas) { this.pujas = pujas; }
public Set getPujas() { return pujas; }
publicvoidaddPuja(Pujapuja) { puja.setArticulo(this); pujas.add(puja);
} ...
}
publicclass Puja{ ... private Articulo articulo;
public void setArticulo(Articulo articulo) { this.articulo = articulo; }
public Articulo getArticulo() { return articulo; }
... }
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -12
Asociación many-to-one (one-to-many) bidireccionalMapeado Hibernate
<class name="Articulo" table="ARTICULO">
... <setname="pujas"
inverse="true" cascade="all-delete-orphan"> <key column="ARTICULO_ID"/> <one-to-many class="Puja"/>
<set/> </class>
<class name="Puja" table="PUJA"> <id name="id" column="PUJA_ID"> <generatorclass="native"> </id> ... <many-to-one name="articulo"
column="ARTICULO_ID" class="Articulo" not-null="true"/>
</class>
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -13
Asociaciones bidireccionales• Todas las asociaciones bidireccionales
necesitan que uno de sus extremos sea marcado como inverse. • En many-to-one/one-to-many se marcará el extremo
many• En many-to-many podemos elegir cualquiera
• Los cambios realizados solamente en el extremo de la asociación marcado como inverse no se convierten en persistentes
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -14
Asociación one-to-many (unidireccional)Mapeado Hibernate
<classname="Puja" table="PUJA"> <idname="id"
column="PUJA_ID"> <generator class="native">
</id> </class>
<classname="Articulo" table="ARTICULO">
<id name="id" column="ARTICULO_ID">
<generatorclass="native"/> </id> ... <setname="pujas">
<key column="ARTICULO_ID" not-null="true"/>
<one-to-many class="Puja"/> </set>
</class>
PujaArticulo1..1 0..*
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -15
Asociación one-to-one (unidireccional)Mapeado Hibernate
<classname="Usuario" table="USUARIO">
<idname="id" column="USER_ID"> ... <many-to-one name="direccionFacturas"
class="Direccion" column="DIRECC_ID" cascade="all" unique="true"/>
</class>
<classname="Direccion" table="DIRECCION">
<idname="id" column="DIRECC_ID"> <generatorclass="native"/>
</id> <propertyname="calle"/> <propertyname="ciudad"/> <propertyname="codPostal"/>
</class>
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -16
Asociación one-to-one (bidireccional)Mapeado Hibernate
<classname="Usuario" table="USUARIO">
<idname="id" column="USER_ID"> ... <many-to-one name="direccionFacturas"
class="Direccion" column="DIRECC_ID" cascade="all" unique="true"/>
</class>
<classname="Direccion" table="DIRECCION">
<idname="id" column="DIRECC_ID">
<generator class="native"> </id> <one-to-one name="usuario"
class="Usuario" property-ref="direccionFacturas"/>
...</class>
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -17
Asociación many-to-many (unidireccional)
<classname="Elemento"> <idname="id"
column="ELEMENTO_ID"> <generatorclass="native"/> </id>
</class>
<classname="Categoria"> <idname="id"
column="CATEGORIA_ID"> <generator class="native"/>
</id> <setname="elementos"
table="CategElement"> <key column="CATEGORIA_ID"/> <many-to-many
column="ELEMENTO_ID" class="Elemento"/>
</set> </class>
Mapeado Hibernate
Especialista Universitario Java Enterprise
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos -18
Asociación many-to-many (bidireccional)
<classname="Elemento"> <idname="id"
column="ELEMENTO_ID"> <generatorclass="native"/> </id> <setname="categorias"
inverse="true" table="CategElement">
<key column="ELEMENTO_ID"/> <many-to-many
column="CATEGORIA_ID" class="Categoria"/>
</set> </class>
<classname="Categoria"> <id name="id"
column="CATEGORIA_ID"> <generator class="native"/> </id> <set name="elementos"
table="CategElement"> <key column="CATEGORIA_ID"/> <many-to-many
column="ELEMENTO_ID" class="Elemento"/>
</set> </class>
Mapeado Hibernate
cat.getElementos().add(elem); elem.getCategorias().add(cat);
Hibernate © 2006-2007 Depto. Ciencia de la Computación e IA Relaciones entre objetos
Especialista Universitario Java Enterprise
¿Preguntas...?