Embeber llave primaria con @EmbeddedId

Tutorial de JPAOtra manera de definir llaves primarías compuestas es con la Enumeración @EmbeddedId, la cual permite marcar una clase como ID. A diferencia de @IdClass, este método no requiere definir los atriburos de la llave primaria en la entidad, sino que solo hace falta agregar como atributo la clase que contiene todos los campos.

Una diferencia que tiene este método con respecto al @IdClass, es qué es necesario que la clase ID esta anotada a nivel de clase con la anotación @Embeddable. Esto le dice a JPA que esta clase se puede embeber dentro de otra.

 

Vamos a retomar la entidad Telephone y la clase TelephonePK y las modificaremos que en lugar de usar @Id, utilice @EmbeddedId. Modificaremos la clase TelephonePK y quedaría de la siguiente manera:

Observemos primero que nada que se le agrego la anotación @Embeddable a nivel de clase y los método equals y hashCode continuan definidos.

 

En segundo lugar, modificaremos la entidad Telephone y quedaría de la siguiente manera:

Primero que nada, observemos que hemos retirado las propiedades employeeId y telType para ser sustituido por la case TelephonePK, a la cual le agregamos la anotación @EmbeddedId.

La anotación @EmbeddedId provocara que los campos definidos en la clase TelephonePK sean considerados como si fueran parte de la clase Telephone.

 

Cabe mencionar que tanto @IdClass como @EmbeddedId darán el mismo resultado en tiempo de ejecución, por lo que la única diferencia es solo a nivel del código. Recordemos que con @IdClass es necesario definir los campo que serán la llave primaria tanto en la Entidad como en las clases Id, en cambio, con @EmbeddedId solo será necesario embeber la llave como una propiedad más de la case. Particularmente yo prefiero trabajar con @EmbeddedId para evitar repetir atributos.

 

Finalmente veamos cómo quedaría la tabla generada por JPA, la cual es igual en estructura a la tabla generada utilizando @IdClass que vimos en la sección anterior:

Tabla con @EmbeddedId

 

NOTA: Este artículo es solo una sección del Tutorial de JPA, para ver el contenido completo de este tutorial regresa al Índice en el botón de abajo.

 

AnteriorÍndiceSiguiente
 

Artículos relacionados

CSS TIP #1: Tarjetas de colores https://youtu.be/BjOUZrx7alA En este video aprenderemos a crear tarjetas de colores simples y animadas, las cuales podemos utilizar para mostrar nu...
Como construir un API REST con NodeJS (Primera par... Hoy en día, es más notable la necesidad de construir API’s para nuestras aplicaciones, las cuales nos permitan integrar nuestras aplicaciones con otra...

Oscar Blancarte

Ideológico, Innovador y emprendedor, Padre, Tecnólogo y Autor, amante de la ciencia y la tecnología en todos sus colores y sabores. Arquitecto de software & Full Stack Developer con experiencia en la industria del desarrollo de software y la consultoría. Amante de la programación y el Ajedrez.

2 comentarios en “Embeber llave primaria con @EmbeddedId

  1. Saludos: en mi caso he estado manejando entidades con dos llaves de una manera muy sencilla mas o menos de la siguiente manera:
    En mi clase Usuario ademas de los campos propios de la clase, tengo esta anotacion y me crea una tabla UsuarioPantalla con 2 campos idUsuario e idPantalla. La cual me mantiene una relacion entre la clase Usuario y la clase Pantalla.
    @Entity
    @Table(name = "Usuario")
    public class Usuario extends EntidadBase implements Serializable {
    private static final long serialVersionUID = -6695788587077076257L;
    @Column(name = "clave", unique = true, nullable = false)
    private String clave;

    @Column(name = "nombre", nullable = false)
    private String nombre;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "UsuarioPantalla"
    , joinColumns = { @JoinColumn(name = "idUsuario", nullable = false, updatable = false) }
    , inverseJoinColumns = { @JoinColumn(name = "idPantalla", nullable = false, updatable = false) })
    private Set pantallas = new HashSet();

    public Set getPantallas() {
    return pantallas;
    }
    public void setPantallas(Set pantallas) {
    this.pantallas = pantallas;
    }

    …..
    en JS lo implemento asi mas o menos
    var Ousuariodb = db.get(Usuario, idUsuario);
    var Opantalladb = db.get(Pantalla, idPantalla);
    Ousuariodb.getPantallas().add(Opantalladb);

    El metodos getPantallas() tambien me trea una lista con todos las pantallas de un usuario, ahi todo bien.

    Hasta el momento no he tenido problemas al manejar relacionadores con llaves dobles El PROBLEMA viene cuando quiero crear un relacionador con tres llaves supongamos que quiciera un relacionador entre las clases Usuario, Pantalla y Empresa. ¿Cual seria la manera mas sencilla de implemetar esto?
    Veo tu codigo tan diferente que no se si sea porque el mio este implementado en eclipse o de plano sean cosas totalmente diferentes.
    Muchas gracias por su tiempo.

    1. Hola Mario, para empezar, tu propiedad pantallas no está muy clara, por que no tiene el tipo genérico, asumo que guardas otras entidades dentro.

      Lo que utilizaría para crear una llave compuesta de dos o más campos sería crear una clase con las 3 propiedades y anotarla con @Embeddable, luego, en la entidad crear una propiedad de la clase anterior y anotarla con @EmbeddedId, esto le dirá a JPA que los campos de la primera clase será la llave primaria.
      espero que esto resuelva tu duda.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *