HIBERNATE - jtech.ua.es · Especialista Universitario Java Enterprise Hibernate © 2006-2007 Depto....

Post on 16-Apr-2020

8 views 0 download

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...?