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
EmbeddedIdoIdClass. 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
IdClassLa clase para la clave primaria compuesta podría verse así (podría ser una clase interna estática):
Y la entidad:
los
IdClassanotación asigna múltiples campos a la tabla PK.Con
EmbeddedIdLa clase para la clave primaria compuesta podría verse así (podría ser una clase interna estática):
Y la entidad:
los
@EmbeddedIdanotación asigna una clase PK a la tabla PK.Diferencias:
@EmbeddedIdde 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 .@IdClasses ú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
IdClasscon
EmbeddedIdReferencias
fuente
idsiemprenullse 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
@Embeddabledel identificador compuesto:Con esto en su lugar, podemos mapear la
Employeeentidad que usa el identificador compuesto al anotarlo con@EmbeddedId:La
Phoneentidad que tiene una@ManyToOneasociación conEmployee, necesita hacer referencia al identificador compuesto de la clase padre a través de dos@JoinColumnasignaciones: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
testycustomerse describen allí como:Hay una tabla más que mantiene la pista de
testsycustomer:Podemos ver que en la tabla
tests_purchasedla clave primaria es una clave compuesta, por lo que utilizaremos la<composite-id ...>...</composite-id>etiqueta en elhbm.xmlarchivo de mapeo. EntoncesPurchasedTest.hbm.xmlse 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, unaPurchasedTestIdclase) 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