web-dev-qa-db-fra.com

@OneToMany sans relation inverse et sans table de jointure?

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?

33
jsight

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.

50
Arthur Ronald

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'appelle A_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 table A et a le même type que la clé primaire de la table A. 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 table A. L'autre étranger La colonne clé fait référence à la table B et a du même type que la clé primaire de table B 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 table B.

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.

Références

15
Pascal Thivent

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.

0
dinesh ranawat