Dans ce code, comment générer une classe Java pour la clé composite (comment créer une clé composite en hibernation):
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;
Réponses:
Pour mapper une clé composite, vous pouvez utiliser le
EmbeddedId
ou lesIdClass
annotations. Je sais que cette question ne concerne pas strictement JPA mais les règles définies par la spécification s'appliquent également. Les voici donc:Avec un
IdClass
La classe de la clé primaire composite pourrait ressembler (pourrait être une classe interne statique):
Et l'entité:
L'
IdClass
annotation mappe plusieurs champs à la table PK.Avec
EmbeddedId
La classe de la clé primaire composite pourrait ressembler (pourrait être une classe interne statique):
Et l'entité:
L'
@EmbeddedId
annotation mappe une classe PK à la table PK.Différences:
@EmbeddedId
communique en quelque sorte plus clairement que la clé est une clé composite et IMO est logique lorsque le pk combiné est soit une entité significative elle-même, soit réutilisé dans votre code .@IdClass
est utile pour spécifier qu'une combinaison de champs est unique mais ceux-ci n'ont pas de signification particulière .Ils affectent également la façon dont vous écrivez des requêtes (les rendant plus ou moins verbeuses):
avec
IdClass
avec
EmbeddedId
Références
la source
id
est toujoursnull
généré et n'est pas généré: /@IdClass
: "Il a été hérité de l'âge sombre d'EJB 2 pour des raisons de compatibilité descendante et nous vous recommandons de ne pas l'utiliser (par souci de simplicité)."Vous devez utiliser
@EmbeddedId
:la source
Comme je l'ai expliqué dans cet article , en supposant que vous disposez des tables de base de données suivantes:
Tout d'abord, vous devez créer le
@Embeddable
contenant l'identifiant composite:Avec cela en place, nous pouvons mapper l'
Employee
entité qui utilise l'identifiant composite en l'annotant avec@EmbeddedId
:L'
Phone
entité qui est@ManyToOne
associée àEmployee
doit référencer l'identifiant composite de la classe parente via deux@JoinColumn
mappages:Pour plus de détails, consultez cet article .
la source
La classe de clé primaire doit définir les méthodes equals et hashCode
Plus techniquement: vous devez suivre le principe de substitution de Liskows et ignorer la symétrie.
http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html
la source
On dirait que vous faites cela à partir de zéro. Essayez d'utiliser les outils d'ingénierie inverse disponibles comme les entités Netbeans de la base de données pour au moins automatiser les bases (comme les identifiants intégrés). Cela peut devenir un énorme casse-tête si vous avez plusieurs tables. Je suggère d'éviter de réinventer la roue et d'utiliser autant d'outils disponibles que possible pour réduire le codage au minimum et le plus important, ce que vous avez l'intention de faire.
la source
Prenons un exemple simple. Disons que deux tables sont nommées
test
etcustomer
sont décrites comme suit:Une autre table est là qui garde la trace de
test
s etcustomer
:Nous pouvons voir que dans le tableau,
tests_purchased
la clé primaire est une clé composite, nous allons donc utiliser la<composite-id ...>...</composite-id>
balise dans lehbm.xml
fichier de mappage. Donc,PurchasedTest.hbm.xml
cela ressemblera à:Mais cela ne s'arrête pas là. Dans Hibernate, nous utilisons session.load (
entityClass
,id_type_object
) pour rechercher et charger l'entité à l'aide de la clé primaire. En cas de clés composites, l'objet ID doit être une classe ID distincte (dans le cas ci-dessus unePurchasedTestId
classe) qui déclare simplement les attributs de clé primaire comme ci - dessous :Le point important est que nous implémentons également les deux fonctions
hashCode()
etequals()
qu'Hibernate s'appuie sur elles.la source
Une autre option consiste à mapper en tant que carte d'éléments composites dans la table ConfPath.
Ce mappage bénéficierait cependant d'un index sur (ConfPathID, levelStation).
Cartographie:
la source
Classe de clé composite
Classe d'entité
la source