2.2 Llaves Primarias Compuestas @Embeddable y @EmbeddedId

<< Anterior - Volver Menu JPA - Siguiente >>

Para la generacion de llaves primarias de tipo @EmbeddedId en el Framework Taylor se debe generar por lo menos dos clases:

Clase 1:

  • La clase de ser de tipo Embeddable, esto quiere decir que la clase va ser embebida en una entidad y debe se anotada con @Embeddable. Para hacer esto en Taylor se debe seleccionar el objeto que representa la clase Embeddable en la parte de Izquierda de la pantalla, luego nos dirigimos a la parte inferior de ella, donde encontramos las propiedades de dicha objeto, a continuación seleccionamos Stereotypes y primero nos fijamos en el contenedor Applied Sterotypes si se encuentra el estereotipo Entity, si es asi, debemos de removerlo de ahí, luego en el contenedor Avaliable Stereotypes seleccionamos el estereotipo Embeddable y le damos clic en la opción “Add»”.
  • La clase Embeddable debe implementar la clase Serializable.
  • La clase Embeddable debe tener el método constructor pero no debe llevar ningún argumento.
  • La clase Embeddable solo debe tener los atributos o campos que van a conformar la llave primaria compuesta.
  • La clase Embeddable debe implementar los métodos hashCode() y equals() ya que Taylor no genera estos metodos.

Clase 2:

  • La clase debe ser de tipo Entidad, esto quiere decir que la clase debe implementar la anotación @Entity.
  • La clase Entidad debe tener un atributo o hacer una instancia de la clase embebida, y se debe anotar como @EmbeddedId.
  • La clase Entidad en su método constructor no debe tener nada de argumentos.
  • La clase Entidad debe implementar la clase Serializable.
  • Por ultimo modificamos los métodos hashCode(), equals() y deepClone(), esto se hace a mano ya que el compilador detecta errores sobre estos metodos, para ver con mas detalle como deben quedar esos metodos ver la parte de codigo de la clase entidad Persona que se encuentra mas adelante.

En la perspectiva Taylor de Eclipse se debe ver la implementación de llave primaria compuesta con @EmbeddedId, como se ve en el ejemplo a continuación en la figura siguiente.

perspectivaTaylor2.JPG

Como podemos ver en la figura anterior podemos ver la primera clase que es la clase embebida y contiene solo los campos que conforman la llave primaria compuesta, también podemos observar que en la clase dos es de tipo Entidad y tiene un atributo de la clase PersonaPK ademas a eso también esta anotada con @EmbeddedId.

A continuación veremos el ejemplo que se plasma en la figura 1,4 pero en código java:

Clase 1: PersonaPk.class (Clase Embebida).

@Embeddable // Indica que la clase es embebida
//Implementa la clase Serializable
public class PersonaPK implements Serializable, Cloneable{
    /** @generated */
    private static final long serialVersionUID = 1L;

    /** Metodo constructor sin argumentos */
    public PersonaPK() {
    }

    //metodo getter del atributo que representa la primera llave primaria
    public Long getId() {
        return id;
    }

    /** @generated */
    //metodo setter del atributo que representa la primera llave primaria
    public void setId(final Long id) {
        this.id = id;
    }

    /** @generated */
    private Long id = null;

    //metodo getter del atributo que representa la segunda llave primaria
    public String getCedula() {
        return cedula;
    }

    /** @generated */
    //metodo setter del atributo que representa la segunda llave primaria
    public void setCedula(final String cedula) {
        this.cedula = cedula;
    }

    /** @generated */
    private String cedula = null;

    public int hashCode() {
        return (int) (cedula.hashCode() + id);
    }

    public boolean equals(Object obj) {
        if(obj == this) return true;
        if(!(obj instanceof PersonaPK)) return false;
        if(obj == null) return false;
        PersonaPK pk = (PersonaPK) obj;
        return pk.id == id && pk.cedula.equals(cedula);
    }

}

Clase 2: Persona.class (Clase Entidad).

@Entity // Significa que la clase es de tipo Entidad
//En la clase se Implementa el Serializable
public class Persona implements Serializable, Cloneable{
    /** @generated */
    private static final long serialVersionUID = 1L;

    /** Metodo constructor, no lleva argumentos */
    public Persona() {
    }

    @EmbeddedId //Se define la llave primaria compuesta 
    //metodo getter que representa la llave primaria compuesta
    public PersonaPK getPersonaPk() {
        if (this.personaPk == null) {
            this.personaPk = new PersonaPK();        
        }
        return personaPk;
    }

    /** Metodo setter que representa la llave primaria compuesta */
    public void setPersonaPk(final PersonaPK personaPk) {
        this.personaPk = personaPk;
    }

    /** @generated */
    private PersonaPK personaPk = new PersonaPK();

    *
    *
    *    El resto de atributos que contenga la entidad con sus respectivos getters y setters.
    *
    *

    /** @generated */
    public Persona deepClone() throws Exception {
        Persona clone = (Persona) super.clone();
        clone.setPersonaPk(null);
        return clone;
    }

    /** @generated */
    @Override
    public int hashCode() {
        final int PRIME = 31;
        int result = 1;
        result = PRIME * result + ((personaPk == null) ? super.hashCode() : personaPk.hashCode());
        return result;
    }

    /** @generated */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Persona))
            return false;
        final Persona other = (Persona) obj;
        if (personaPk == null) {
            if (other.getPersonaPk() != null)
                return false;
        } else if (!personaPk.equals(other.getPersonaPk()))
            return false;
        return true;
    }
}

Ahora veremos utilizando el ejemplo anterior como se mapea este tipo de llave primaria compuesta en la base de datos. Esto lo podemos apreciar en la figura a continuación.

mapeoBD2.JPG

Lo que podemos analizar en la figura anterior es que las dos filas que se encuentran seleccionadas en la columna Primary Key esta el 1 y 2, lo que nos quiere decir es que los campos “ID y CEDULA” son llaves primarias lo cual conforma una llave primaria compuesta de la Tabla “PERSONA”.

<< Anterior - Volver Menu JPA - Siguiente >>

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