SQL JPA – Múltiples columnas como clave principal

2 minutos de lectura

Si quiero varias columnas para crear una identificación.

Ejemplo SQL:

CONSTRAINT [PK_NAME] PRIMARY KEY ([Column1],[Column2],[Column3])

¿Cómo puedo hacer eso con una clase de entidad Jpa? a través de la definición de columna?

simplemente configurando el campo de identificación como:

value = Column1 + Column2 + Column3 // aint working.

Avatar de usuario de Raul Cuth
Raúl Cuth

Necesita tener una clase para su clave compuesta:

public class CompositeKey implements Serializable {
    private int column1;
    private int column2;
    private int column3;
}

y luego en su clase de entidad use el @IdClass anotación:

@Entity
@IdClass(CompositeKey.class)
public class EntityExample {
    @Id
    private int column1;
    @Id
    private int column2;
    @Id
    private int column3;
    ...
    ...
}

Creo que esto debería funcionar.

También existe la otra solución que mencionó @jklee. Ambos funcionan, es una cuestión de preferencia.

avatar de usuario de jklee
jklee

Usar @Embeddable y @EmbeddedId.

Ejemplo:

@Entity
public class Project implements Serializable {
    @EmbeddedId ProjectId id;
}
 
@Embeddable
class ProjectId implements Serializable {
    int departmentId;
    long projectId;
}

Más información aquí http://www.objectdb.com/java/jpa/entity/id#Embedded_Primary_Key_

  • No olvides implementar Serializable 😉

    – Diego Sousa

    8 de enero de 2020 a las 23:56

Si todos los campos de la clase son parte de la clave principal, entonces la solución sería bastante simple (extendiendo la solución provista por @raul-cuth):

@Entity
@IdClass(EntityExample.class)
public class EntityExample implements Serializable {

    @Id
    private int column1;

    @Id
    private int column2;

    @Id
    private int column3;
}

  • ¿Qué pasa si uno de los campos es un FK? Sería un escenario típico al mapear un muchos a muchos relación mesa.

    – Paulo Merson

    13 de diciembre de 2022 a las 18:28

Avatar de usuario de Penguin
Pingüino

  1. Usando @IdClass anotación en el @Entity clase seguida de @Id anotación en campos individuales que forman parte de la clave principal compuesta.
  2. Alternativamente puede hacer uso de @Embeddable clase que puede consistir en campos individuales de la clave primaria compuesta y luego una referencia de esta clase se puede usar como un atributo con @Embedded anotación en @Entity clase. Espero que esto ayude.

Tenga en cuenta que el generador hibernate Entity-Class-to-SQL-DDL-Script ordenará todos los campos e, independientemente del orden en que aparezcan en las definiciones, creará la definición de la tabla y las definiciones de índice/restricción en este orden. orden de los campos.

Si bien el orden de aparición de los campos en la definición de la tabla puede no importar mucho, el orden de los campos en un índice compuesto definitivamente sí importa. Por lo tanto, sus campos clave deben tener un nombre para que, cuando se ordenen por sus nombres, estén en el orden que desea para el índice).

¿Ha sido útil esta solución?