Neste código, como gerar uma classe Java para a chave composta (como compor a chave no hibernate):
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;
Respostas:
Para mapear uma chave composta, você pode usar as
EmbeddedId
ou asIdClass
anotações. Eu sei que esta pergunta não é estritamente sobre JPA, mas as regras definidas pela especificação também se aplicam. Então aqui estão eles:Com um
IdClass
A classe da chave primária composta pode parecer (poderia ser uma classe interna estática):
E a entidade:
A
IdClass
anotação mapeia vários campos para a tabela PK.Com
EmbeddedId
A classe da chave primária composta pode parecer (poderia ser uma classe interna estática):
E a entidade:
A
@EmbeddedId
anotação mapeia uma classe PK para a tabela PK.Diferenças:
@EmbeddedId
de alguma forma, comunica com mais clareza que a chave é uma chave composta e o IMO faz sentido quando a pk combinada é uma entidade significativa em si ou é reutilizada no seu código .@IdClass
é útil especificar que alguma combinação de campos é única, mas esses não têm um significado especial .Eles também afetam a maneira como você escreve as consultas (tornando-as mais ou menos detalhadas):
com
IdClass
com
EmbeddedId
Referências
fonte
id
é semprenull
e não são geradas: /@IdClass
: "Ele foi herdado da idade das trevas do EJB 2 para compatibilidade com versões anteriores e recomendamos que você não o use (por uma questão de simplicidade)".Você precisa usar
@EmbeddedId
:fonte
Como expliquei neste artigo , supondo que você tenha as seguintes tabelas de banco de dados:
Primeiro, você precisa criar a
@Embeddable
retenção do identificador composto:Com isso, podemos mapear a
Employee
entidade que usa o identificador composto anotando-o com@EmbeddedId
:A
Phone
entidade que tem uma@ManyToOne
associaçãoEmployee
precisa fazer referência ao identificador composto da classe pai por meio de dois@JoinColumn
mapeamentos:Para mais detalhes, consulte este artigo .
fonte
A classe de chave primária deve definir métodos iguais e hashCode
Mais tecnicamente: você deve seguir o Princípio de substituição de Liskows e ignorar a simetria.
http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html
fonte
Parece que você está fazendo isso do zero. Tente usar as ferramentas de engenharia reversa disponíveis, como o Netbeans Entities from Database, para pelo menos automatizar o básico (como IDs incorporados). Isso pode se tornar uma enorme dor de cabeça se você tiver muitas tabelas. Sugiro evitar reinventar a roda e usar o maior número possível de ferramentas para reduzir a codificação à parte mínima e mais importante, o que você pretende fazer.
fonte
Vamos dar um exemplo simples. Digamos duas tabelas nomeadas
test
ecustomer
são descritas como:Existe mais uma tabela que mantém o controle de
test
s ecustomer
:Podemos ver que na tabela
tests_purchased
a chave primária é uma chave composta, portanto, usaremos a<composite-id ...>...</composite-id>
tag nohbm.xml
arquivo de mapeamento. Então, aPurchasedTest.hbm.xml
aparência será:Mas isso não termina aqui. No Hibernate, usamos session.load (
entityClass
,id_type_object
) para localizar e carregar a entidade usando a chave primária. No caso de chaves compostas, o objeto ID deve ser uma classe de ID separada (no caso acima, umaPurchasedTestId
classe) que apenas declara os atributos da chave primária, como abaixo :O ponto importante é que também implementamos as duas funções
hashCode()
eequals()
o Hibernate depende delas.fonte
Outra opção é mapear como um Mapa de elementos compostos na tabela ConfPath.
Esse mapeamento se beneficiaria de um índice em (ConfPathID, levelStation).
Mapeamento:
fonte
Classe de chave composta
Classe de entidade
fonte