En este código, cómo generar una clase Java para la clave compuesta (cómo componer clave en hibernación):
create table Time (
levelStation int(15) not null,
src varchar(100) not null,
dst varchar(100) not null,
distance int(15) not null,
price int(15) not null,
confPathID int(15) not null,
constraint ConfPath_fk foreign key(confPathID) references ConfPath(confPathID),
primary key (levelStation, confPathID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Respuestas:
Para asignar una clave compuesta, puede usar las anotaciones
EmbeddedId
oIdClass
. Sé que esta pregunta no es estrictamente sobre JPA, pero también se aplican las reglas definidas por la especificación. Así que aquí están:Con un
IdClass
La clase para la clave primaria compuesta podría verse así (podría ser una clase interna estática):
Y la entidad:
los
IdClass
anotación asigna múltiples campos a la tabla PK.Con
EmbeddedId
La clase para la clave primaria compuesta podría verse así (podría ser una clase interna estática):
Y la entidad:
los
@EmbeddedId
anotación asigna una clase PK a la tabla PK.Diferencias:
@EmbeddedId
de alguna manera se comunica más claramente que la clave es una clave compuesta y la OMI tiene sentido cuando el pk combinado es una entidad significativa en sí misma o se reutiliza en su código .@IdClass
es útil para especificar que alguna combinación de campos es única, pero estos no tienen un significado especial .También afectan la forma en que escribe consultas (haciéndolas más o menos detalladas):
con
IdClass
con
EmbeddedId
Referencias
fuente
id
siemprenull
se genera y no se genera: /@IdClass
: "Se ha heredado de la edad oscura de EJB 2 por compatibilidad con versiones anteriores y le recomendamos que no lo use (por simplicidad)".Necesitas usar
@EmbeddedId
:fuente
Como expliqué en este artículo , suponiendo que tenga las siguientes tablas de base de datos:
Primero, debe crear el contenido
@Embeddable
del identificador compuesto:Con esto en su lugar, podemos mapear la
Employee
entidad que usa el identificador compuesto al anotarlo con@EmbeddedId
:La
Phone
entidad que tiene una@ManyToOne
asociación conEmployee
, necesita hacer referencia al identificador compuesto de la clase padre a través de dos@JoinColumn
asignaciones:Para más detalles, mira este artículo .
fuente
La clase de clave primaria debe definir métodos igual y hashCode
Más técnicamente: debe seguir el Principio de sustitución de Liskows e ignorar la simetría.
http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html
fuente
Parece que estás haciendo esto desde cero. Intente utilizar las herramientas de ingeniería inversa disponibles como las Entidades Netbeans de la Base de Datos para al menos automatizar los conceptos básicos (como identificadores integrados). Esto puede convertirse en un gran dolor de cabeza si tienes muchas mesas. Sugiero evitar reinventar la rueda y utilizar tantas herramientas como sea posible para reducir la codificación a la parte mínima y más importante, lo que intenta hacer.
fuente
Tomemos un ejemplo simple. Digamos dos tablas nombradas
test
ycustomer
se describen allí como:Hay una tabla más que mantiene la pista de
test
sycustomer
:Podemos ver que en la tabla
tests_purchased
la clave primaria es una clave compuesta, por lo que utilizaremos la<composite-id ...>...</composite-id>
etiqueta en elhbm.xml
archivo de mapeo. EntoncesPurchasedTest.hbm.xml
se verá así:Pero no termina aquí. En Hibernate usamos session.load (
entityClass
,id_type_object
) para encontrar y cargar la entidad usando la clave primaria. En el caso de las claves compuestas, el objeto de ID debe ser una clase de ID separada (en el caso anterior, unaPurchasedTestId
clase) que simplemente declara los atributos de la clave primaria como a continuación :El punto importante es que también implementamos las dos funciones
hashCode()
yequals()
como Hibernate depende de ellas.fuente
Otra opción es mapear es como un mapa de elementos compuestos en la tabla ConfPath.
Sin embargo, esta asignación se beneficiaría de un índice en (ConfPathID, levelStation).
Cartografía:
fuente
Clase de clave compuesta
Clase de entidad
fuente