C'est un problème similaire à "Hibernate @OneToMany sans table de jointure distincte" , en ce sens que j'ai besoin d'une relation @OneToMany sans table de jointure. Cependant, je voudrais aussi ne pas définir la relation inverse. La suppression de l'inverse semble entraîner la génération automatique d'une table de jointure. Existe-t-il une solution de contournement?
Dans JPA 2.0+, vous pouvez utiliser @JoinColumn pour éviter de générer une table jointe.
Essayez-le.
@OneToMany
@JoinColumn(name="COLUMN_NAME")
METTRE À JOUR
Les informations fournies ci-dessus ont été extraites du livre o'reilly de l'EJB 3.0 (recherchez l'annotation @JoinColumn référence la colonne CUSTOMER_ID de la table PHONE). Cependant, la spécification JPA 1.0 en clair ne prend pas en charge cette fonctionnalité. Ce qu'il dit est
Les relations unidirectionnelles un à plusieurs peuvent être implémentées à l'aide de mappages un à plusieurs de clés étrangères. Toutefois, cette prise en charge n'est pas requise dans cette version. Les applications qui souhaitent utiliser une stratégie de mappage de clé étrangère pour des relations un à plusieurs doivent rendre ces relations bidirectionnelles pour assurer la portabilité
Donc dans 1.0 c'est une implémentation spécifique au vendeur (Et cela a du sens, l'auteur travaille chez JBoss - La division Red Hat derrière l'hibernation)
Mais il est pris en charge par la mise en œuvre de JPA 2.0
Si la jointure concerne un mappage OneToMany unidirectionnel à l'aide d'une stratégie de mappage de clé étrangère, la clé étrangère se trouve dans la table de l'entité cible.
La spécification JPA 1.0 ne PAS prend en charge le mappage OneToMany unidirectionnel sans table de jointure.
Et l'utilisation de JoinColumn
sur OneToMany
n'est pas autorisée dans standard JPA 1.0 (uniquement sur OneToOne
, ManyToOne
ou ManyToMany
). C'est dans JPA 2.0 cependant.
A partir de la spécification JPA 1.0:
2.1.8.5.1 Relations OneToMany unidirectionnelles
Les valeurs de mappage suivantes s'appliquent:
L'entité A est mappée sur une table nommée
A
. L'entité B est mappée sur une table nomméB
. Il y a une table de jointure qui s'appelleA_B
(nom du propriétaire first). Cette table de jointure a deux colonnes de clé étrangère. Une clé étrangère la colonne fait référence à la tableA
et a le même type que la clé primaire de la tableA
. Le nom de cette clé étrangère la colonne est formée comme la concaténation de ce qui suit: le nom de l'entité UNE; "_"; le nom de la clé primaire colonne dans la tableA
. L'autre étranger La colonne clé fait référence à la table B et a du même type que la clé primaire de tableB
et il existe une clé unique contrainte sur elle. Le nom de cette La colonne de clé étrangère est formée en tant que concaténation de ce qui suit: le nom de la propriété de relation ou champ de l'entité A; "_"; le nom de la colonne de clé primaire dans la tableB
.
En résumé, si vous ne voulez pas d'une table de jointure (et d'une prise en charge complète en lecture/écriture) tout en restant conforme à JPA, rendez l'association bidirectionnelle (avec un côté inverse
).
Le lien de livre wiki ci-dessous décrit une astuce (mapper la table cible en tant que table de jointure) pour "contourner" le problème, mais cela ne fonctionne que pour les lectures.
S'il n'y a pas de table de jointure dans la base de données, alors la relation entre deux tables de la base de données serait réalisée par une clé étrangère faisant référence à la clé primaire . Si la relation passe par PK/FK, il doit y avoir une propriété dans la classe cible. qui renvoie à la source de sorte que la colonne FK soit renseignée avec une valeur. Cette propriété de la classe cible peut être un identifiant ou un objet source . S'il s'agit d'un objet source, vous devez disposer d'un @ManyToOne inverse dans la classe cible.