3.3 Relación de Asociación ManyToMany

<< Anterior - Volver Menu JPA - Siguiente >>

Bidireccional:

Para implementar una relación de asociación ManyToMany en Taylor hay que dirigirse a la paleta de la parte derecha y seleccionar el icono de asociación (Asosiation) ManyToMany, luego nos dirigimos a la entidad dueña de la relación (target) y dar clic sostenido, luego sin soltar el clic arrastra el mouse hasta la entidad del otro lado de la relación (source) y por ultimo soltar el clic. Luego como en los ejemplos anteriores de los tipos de Relación de Asociación, le agregamos el valor al atributo mappedBy en el atributo que esta anotado con el tipo de relación que se encuentra en la entidad que es dueña de la asociación.

A continuación podremos ver una figura donde se ilustra lo anterior mencionado en la perspectiva de Taylor en Eclipse:

perspectivaTaylor7.JPG

En la figura anterior podemos analizar que en las dos entidades que hacen parte de la relación se generan un atributo en cada entidad donde hace referencia a la entidad del otro lado de la relación y ademas se encuentran anotados con el estereotipo ManyToMany.

En la siguiente sección observaremos como queda la dos entidades del ejemplo anterior en lenguaje java:

Clase Entidad Factura.class:

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

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

    *
    *
    *    Mas Código.
    *
    *

    // Entidad Factura referencia una coleccion de la Entidad Producto.
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    public Set<Producto> getTarget() {
        if (this.target == null) {
            this.target = new HashSet<Producto>();
        }
        return target;
    }

    /** @generated */
    public void setTarget(final Set<Producto> target) {
        this.target = target;
    }

    /**
     * Associate Factura with Producto
     * @generated
     */

    // Añade un producto en la coleccion
    public void addTarget(Producto target) {
        if (target == null) {
            return;
        }
        getTarget().add(target);
        target.getSource().add(this);
    }

    /**
     * Unassociate Factura from Producto
     * @generated
     */
    // Remueven un producto en la coleccion
    public void removeTarget(Producto target) {
        if (target == null) {
            return;
        }
        getTarget().remove(target);
        target.getSource().remove(this);
    }

    /**
     * @generated
     */

    // Remueven una todos los productos de la coleccion
    public void removeAllTarget() {
        List<Producto> remove = new ArrayList<Producto>();
        remove.addAll(getTarget());
        for (Producto element : remove) {
            removeTarget(element);
        }
    }

    /** @generated */
    private Set<Producto> target = null;

     *
    *
    *    Mas Código.
    *
    *
}

Clase Entidad Producto:

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

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

    *
    *
    *    Mas Código.
    *
    *

    // Entidad Producto que referencia una coleccion de Entidad Factura.
    // Entidad Factura is la Dueña de la relacion.
    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "target", cascade =     CascadeType.ALL)
    public Set<Factura> getSource() {
        if (this.source == null) {
            this.source = new HashSet<Factura>();
        }
        return source;
    }

    /** @generated */
    public void setSource(final Set<Factura> source) {
        this.source = source;
    }

    /**
     * Associate Producto with Factura
     * @generated
     */
    // Añade una Factura a la coleccion.
    public void addSource(Factura source) {
        if (source == null) {
            return;
        }
        getSource().add(source);
        source.getTarget().add(this);
    }

    /**
     * Unassociate Producto from Factura
     * @generated
     */
    // Remueve una Factura a la coleccion.
    public void removeSource(Factura source) {
        if (source == null) {
            return;
        }
        getSource().remove(source);
        source.getTarget().remove(this);
    }

    /**
     * @generated
     */

    // Remueve todas las Facturas de la Coleccion
    public void removeAllSource() {
        List<Factura> remove = new ArrayList<Factura>();
        remove.addAll(getSource());
        for (Factura element : remove) {
            removeSource(element);
        }
    }

    /** @generated */
    private Set<Factura> source = null;

    *
    *
    *    Mas Código.
    *
    *

}

En las Siguientes imágenes veremos como queda mapeada las entidades en la Base de Datos:

mapeoBD14.JPG
mapeoBD15.JPG
mapeoBD16.JPG

Lo que podemos observar en las imágenes anteriores es que se ha generado una nueva tabla detalle en la Base de Datos llamada “FACTURA_PRODUCTO”, que se genera a partir del tipo de asociación que estamos analizando, también podemos observar que esa tabla se crean los campos SOURCE_ID que es el campo que hace la referencia a la tabla FACTURA, y el campo TARGET_ID es el campo que hace referencia a la tabla PRODUCTO.

Unidireccional:

Para realizar la asociación ManyToMany unidireccional en Taylor es realizar los mismos pasos que en los ejemplos anteriores de los tipos de relación, que es deshabilitar el checkBox de nombre IsNavigable. En la imagen siguiente podrán observar como queda el Diagrama de relación de entidades en la perspectiva de Taylor.

perspectivaTaylor8.JPG

Como podremos apreciar en la imagen anterior, es que al momento de deshabilitar el checkbox, automáticamente se desaparece o se elimina el atributo que esta anotado con el tipo de asociación ManyToMany de la entidad Segunda o Final de la relación.

A continuación podremos ver como queda el tipo de Asociación ManyToMany unidireccional en código java:

Clase Entidad Factura.class:

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

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

    *
    *
    *    Mas Código.
    *
    *

    // La Entidad Factura referenacia una coleccion de la Entidad Producto.
    // La Entidad Factura es la Dueña de la Relacion.
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    public Set<Producto> getTarget() {
        if (this.target == null) {
            this.target = new HashSet<Producto>();
        }
        return target;
    }

    /** @generated */
    public void setTarget(final Set<Producto> target) {
        this.target = target;
    }

    /**
     * Associate Factura with Producto
     * @generated
     */
    //Metodo que añade un Producto a la Coleccion
    public void addTarget(Producto target) {
        if (target == null) {
            return;
        }
        getTarget().add(target);
    }

    /**
     * Unassociate Factura from Producto
     * @generated
     */
    // Metodo que remueve un Producto de la Coleccion
    public void removeTarget(Producto target) {
        if (target == null) {
            return;
        }
        getTarget().remove(target);
    }

    /**
     * @generated
     */
    // Metodo que remueve todos los Productos de la Coleccion
    public void removeAllTarget() {
        List<Producto> remove = new ArrayList<Producto>();
        remove.addAll(getTarget());
        for (Producto element : remove) {
            removeTarget(element);
        }
    }

    /** @generated */
    private Set<Producto> target = null;

    *
    *
    *    Mas Código.
    *
    *

}

Clase Entidad Factura.class:

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

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

    // La Entidad Producto no referncia a la Entidad Factura.

    *
    *
    *    Mas Código.
    *
    *

}

En las Siguientes imágenes veremos como queda mapeada las entidades en la Base de Datos:

mapeoBD14.JPG
mapeoBD15.JPG
mapeoBD16.JPG

Lo que podemos concluir de las imágenes anteriores es que al momento de mapearse en la Base de Datos, este tipo de Relación de Asociación unidireccional, se obtiene el mimo resultado que en el de tipo bidireccional.

<< Anterior - Volver Menu JPA - Siguiente >>

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