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.
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.
-
Tenga en cuenta que existe un requisito para implementar equals / hashCode (ver docs.jboss.org/hibernate/orm/5.4/userguide/html_single/…)
– PresentProgrammer
8 abr 2020 a las 17:20
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
Pingüino
- Usando
@IdClass
anotación en el@Entity
clase seguida de@Id
anotación en campos individuales que forman parte de la clave principal compuesta. - 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).