3.1 Relación de Asociación OneToOne

<< Anterior - Volver Menu JPA - Siguiente >>

Bidireccional

Por defecto en Taylor cuando se realiza una relación OneToOne, el la va a hacer bidireccional, esto quiere decir que en ambas entidades van a tener un atributo que va ser una instancia de la otra clase a la cual tienen la relación, a demás de eso, se anotaran con @OneToOne en ambos lados. El estereotipo OneToOne tiene unos atributos que por defecto Taylor los define, los cuales son:

  • Cascade: lo que nos define este atributo es que la acción va a haber un efecto cascada, por defecto la coloca de valor All, significa que en todas la acciones de persistencia hay un efecto cascada (persist, remove, update).
  • Fetch: Fetch nos indica el tipo de evaluación, esta el valor EARGER que quiere decir evaluación temprana y LAZY que quiere decir una evaluación perezosa, por defecto Taylor coloca este atributo y de valro EARGER.
  • Optional: Este atributo indica si el valor de la relacion es opcional, por defecto en Taylor cuando se realiza la relacion su valor es true.

Para realizar la relación se debe seleccionar el icono que corresponde a la relación OneToOne que se encuentra en la paleta en la parte derecha de la pantalla, luego damos clic sostenido en la primera entidad y arrastramos el mouse a la otra entidad en la se concreta la relación.

De los atributos de la relación que hablamos anteriormente se debe agregar uno mas y es el atributo mappedBy, esto indica el atributo maestro en la entidad detalle, para realizar esta modificación en la relación nos dirigimos al atributo que representa el maestro en la entidad detalle que se encuentra en la parte izquierda de la pantalla y lo seleccionamos, luego nos dirigimos a la parte inferior de la pantalla donde se encuentra las propiedades del atributo de la entidad y seleccionamos la opción Stereotype Attributes y colocamos en el atributo MappedBy el nombre del atributo que es del mismo tipo de la entidad en la que se esta haciendo la modificación al otro lado de la relación. Como se puede ver en la siguiente imagen:

propiedadesTaylor4.JPG

Cuando generamos las relaciones, Taylor por defecto le coloca a los atributos que están anotados con las relaciones de asociación los nombre como por ejemplo right - left, o parent-children, o target-source, para cambiar los nombres de estos atributos hay que ir a la parte izquierda de la pantalla donde se encuentran el navegador de objetos o ficheros de eclipse y seleccionar los atributos que tenga el tipo de Asociación luego vamos a la parte inferior de la ventana y seleccionamos la pestaña General, en el campo "Name:", en esta parte podemos editar los nombres de los atributos, este paso se puede ver a continuación:

propiedadesTaylor5.JPG

A continuación veremos un ejemplo de la relación OneToOne bidireccional:

perspectivaTaylor.JPG

Como podemos apreciar en la imagen anterior es que en la dos entidades que estan haciendo la relacion se encuentran los atributos que referencia la entidad del otro lado de la relacion y a demas de eso podemos ver que los dos atributos se encuentran anotados con @OneToOne.

A continuacion veremos como implementan la relacion en codigo java las dos entidades.

Clase Entidad - Persona.class:

@Entity
public class Persona implements Serializable, Cloneable{
    /** @generated */
    private static final long serialVersionUID = 1L;

    /** @generated */
    public Persona() {
    }

    *
    *
    *     Mas Codigo
    *
    *

    @OneToOne(optional = true, fetch = FetchType.EAGER, cascade =     CascadeType.ALL)
    // La entidad persona hace referencia simple a la entidad ciudad
    public Ciudad getLeft() {
        return left;
    }

    /** @generated */
    public void setLeft(final Ciudad left) {
        this.left = left;
    }

    /** @generated */
    private Ciudad left = null;

    *
    *
    *     Mas Codigo
    *
    *

}

Clase Entidad Ciudad.class:

@Entity
public class Ciudad implements Serializable, Cloneable{
    /** @generated */
    private static final long serialVersionUID = 1L;

    /** @generated */
    public Ciudad() {
    }

    *
    *
    *     Mas Codigo
    *
    *

    /**
     * La entidad Ciudad hace una referencia simple de la entidad Persona.
     * Se hace referencia el mapeo a la entidad Persona, lo que indica que la      * Entidad Persona es la 
     * entidad maestra o dueña
     */
    @OneToOne(optional = true, fetch = FetchType.EAGER, mappedBy = "left",     cascade = CascadeType.ALL)
    public Persona getRight() {
        return right;
    }

    /** @generated */
    public void setRight(final Persona right) {
        this.right = right;
    }

    /** @generated */
    private Persona right = null;

    *
    *
    *     Mas Codigo
    *
    *

}

Ahora veremos en la siguiente imagen veremos la forma como se mapea la relacion en la Base de Datos siguiendo el ejemplo anterior:

mapeoBD3.JPG
mapeoBD4.JPG

Como podemos ver en la figura que corresponde a la tabla PERSONA en el ultimo campo que se llama LEFT_ID, lo que quiere decir es que hace referencia a la tabla CIUDAD y por lo tanto es una llave foránea. Esto también lo podemos ver en la siguiente imagen donde la pestaña de Constraints aparece una tabla donde la primera fila hace referencia la llave foránea de la tabla y en la columna Reference Table hace referencia a la tabla CIUDAD.

mapeoBD5(1).JPG

Unidireccional:

Una relacion Unidireccional quiere decir que Solo en un lado de la relacion se hace una referencia simple de la otra entidad que se encuentra al otro lado de dica relacion. En la siguiente figura podremos ver la Relacion de Asociacion OneToOne unidireccional sobre la perspectiva de Taylor:

perspectivaTaylor3.JPG

Como podemos ver en al imagen anterior, en la parte izquierda donde se encuentra el navegador de ficheros u objetos, en la entidad Ciudad ya no se encuentra un atributo que haga referencia a la otra entidad que hace parte de la relación, y mucho menos se encuentra anotado con @OneToOne, en cambio en la Entidad persona encontramos un atributo que hace referencia a la Entidad Ciudad y se encuentra anotada con @OneToOne. Para realizar lo anterior solo nos dirigimos a la parte de navegador de objetos o fichero y seleccionamos el objeto que se tiene el icono de Asociación (Asociation) luego nos dirigimos a la parte inferior de la ventana, donde se encuentra la propiedades, seleccionamos la pestaña Second End y deshabilitamos el CheckBox IsNavigable, como se ve en la siguiente imagen, con esto lo que haría es que en la entidad que no es la entidad Detalle de la relación quita o elimina el atributo de referencia de la otra Entidad y la Anotación de Asociación.

asociacionOneToOne.JPG

A continuación veremos como implementan la relación unidireccional en código java, siguiendo el ejemplo anterior.

Clase Entidad Persona.class:

@Entity
public class Persona implements Serializable, Cloneable{
    /** @generated */
    private static final long serialVersionUID = 1L;

    /** @generated */
    public Persona() {
    }

    *
    *
    *    Mas Código
    *
    *

    // La entidad Persona hace referencia simple a la entidad Ciudad.
    // La entidad Persona es dueña de la relacion.
    @OneToOne(optional = true, fetch = FetchType.EAGER, cascade =     CascadeType.ALL)
    public Ciudad getLeft() {
        return left;
    }

    /** @generated */
    public void setLeft(final Ciudad left) {
        this.left = left;
    }

    /** @generated */
    private Ciudad left = null;

    *
    *
    * Mas Código
    *
    *

}

Clase Entidad Ciudad.class:

@Entity
public class Ciudad implements Serializable, Cloneable{
    /** @generated */
    private static final long serialVersionUID = 1L;

    /** @generated */
    public Ciudad() {
    }

    // La entidad Ciudad no implementa ningun tipo de relacion.

    *
    *
    *    Mas Codigo
    *
    *

}

Por ultimo veremos en las siguientes imágenes la forma en como se mapea este tipo de Asociación unidireccional en la Base de Datos:

mapeoBD3.JPG
mapeoBD6.JPG

Lo que podemos ver es que en la Tabla PERSONA se ha agregado un campo llamado “LEFT_ID”, lo que quiere decir es que ese campo hace referencia a la tabla CIUDAD.

<< Anterior - Volver Menu JPA - Siguiente >>

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License