Comment mapper une clé composite avec mise en veille prolongée?
Dans ce code, comment générer une classe Java pour la clé composite (comment composite clé dans la mise en veille):
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;
- Voir stackoverflow.com/questions/2562746/jpa-entity-design-problem/...
- Un très bon jeu d'exemples: vladmihalcea.com/2016/08/01/...
Vous devez vous connecter pour publier un commentaire.
À la carte une clé composite, vous pouvez utiliser le
EmbeddedId
ou laIdClass
annotations. Je sais que cette question n'est pas strictement sur JPA mais les règles définies par la spécification s'applique également. Donc, ici, ils sont:Avec un
IdClass
La classe de la clé primaire composite pourrait ressembler (peut être une statique à l'intérieur de la classe):
Et l'entité:
La
IdClass
annotation des cartes de plusieurs champs à la table de PK.Avec
EmbeddedId
La classe de la clé primaire composite pourrait ressembler (peut être une statique à l'intérieur de la classe):
Et l'entité:
La
@EmbeddedId
annotation cartes un PK classe à la table PK.Différences:
@EmbeddedId
en quelque sorte communique plus clairement que la clé est une clé composite et de l'OMI a de sens lorsque le combiné pk est soit une entité cohérente lui-même ou réutilisés dans votre code.@IdClass
est utile de préciser que certaines combinaison de champs est unique, mais ils n'ont pas de signification particulière.Ils ont également affecter la façon dont vous écrire des requêtes (en les rendant plus ou moins détaillé):
avec
IdClass
avec
EmbeddedId
Références
id
est toujoursnull
et n'est pas généré :/@IdClass
: "Il a été hérité de l'âge des ténèbres de l'EJB 2 pour la rétro-compatibilité et nous vous recommandons de ne pas l'utiliser (par souci de simplicité)."public interface TimeRepository extends JpaRepository<Time, TimePK>
, correct?Vous devez utiliser
@EmbeddedId
:Comme je l'ai expliqué dans cet article, en supposant que vous avez des tables de base de données:
Tout d'abord, vous devez créer le
@Embeddable
maintenant le composite de l'identificateur:Avec cela en place, nous pouvons tracer la
Employee
entité qui utilise le composite identifiant en annotant avec@EmbeddedId
:La
Phone
entité qui a un@ManyToOne
association pourEmployee
, doit faire référence au composite identificateur de la classe parent par l'intermédiaire de deux@JoinColumn
mappages:Pour plus de détails, consultez cet article.
Dirait que vous faites cela à partir de zéro. Essayez d'utiliser la disposition de l'ingénierie inverse des outils comme Netbeans Entités de la Base de données pour au moins avoir les bases automatisées (comme intégré ids). Cela peut devenir un énorme mal de tête si vous disposez de plusieurs tables. Je suggère d'éviter de réinventer la roue et l'utiliser comme la plupart des outils disponibles que possible afin de réduire le codage, pour le minimum et le plus important, ce que vous avez l'intention de le faire.
La clé primaire de la classe doit définir equals et hashCode méthodes
Plus techniquement: Vous devez suivre les Liskows Principe de Substitution et d'ignorer symmetricity.
http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html
Prenons un exemple simple. Disons que deux tables nommées
test
etcustomer
y sont décrites comme suit:Un de plus le tableau est là, qui garde la trace de
test
s etcustomer
:On peut le voir dans le tableau
tests_purchased
la clé primaire une clé composée, nous allons donc utiliser le<composite-id ...>...</composite-id>
balise dans lehbm.xml
fichier de mappage. Ainsi, lePurchasedTest.hbm.xml
ressemblera:Mais il ne s'arrête pas là. En mode veille prolongée, nous utilisons des.charge (
entityClass
,id_type_object
) à trouver et à charge de l'entité à l'aide de la clé primaire. Dans le cas de clés composites, l'ID de l'objet doit être séparé de l'ID de classe (dans le cas ci-dessus, unPurchasedTestId
classe) qui déclare simplement la clé primaire des attributs comme ci-dessous:Point Important est que nous avons également mettre en œuvre les deux fonctions
hashCode()
etequals()
que la mise en veille s'appuie sur eux.Une autre option est de la carte est une Carte des éléments composites dans le ConfPath table.
Cette cartographie permettrait de bénéficier d'un index sur (ConfPathID,levelStation) si.
Cartographie:
Clé Composite De Classe
Classe D'Entité