J'ai vu des gens utiliser des mappages plusieurs-à-un pour représenter des relations individuelles. J'ai également lu ceci dans un livre de Gavin King et dans des articles.
Par exemple, si un client peut avoir exactement une adresse de livraison et qu'une adresse de livraison ne peut appartenir qu'à un seul client, le mappage est donné comme suit:
<class name="Customer" table="CUSTOMERS">
...
<many-to-one name="shippingAddress"
class="Address"
column="SHIPPING_ADDRESS_ID"
cascade="save-update"
unique="true"/>
...
</class>
Le livre raisonne comme (en le citant):
"Peu importe la cible de l'association, vous pouvez la traiter comme une association to-one sans la partie many"
Ma question est la suivante: pourquoi utiliser many-to-one
et non one-to-one
? Qu'est-ce qui rend un one-to-one
une option moins souhaitable pour many-to-one
?
Merci.
Il existe plusieurs façons d'implémenter une association un-à-un dans une base de données: vous pouvez partager une clé primaire mais vous pouvez également utiliser une relation de clé étrangère avec une contrainte unique (une table a une colonne de clé étrangère qui référence la clé primaire de la table associée).
Dans le dernier cas, la méthode de mise en veille prolongée consiste à utiliser une association many-to-one
(permettant de spécifier la clé étrangère).
La raison est simple: vous n’en faites pas attention ce qui est du côté cible de la association, de sorte que vous pouvez le traiter comme une à une association sans les nombreux partie. Tout ce que vous voulez, c'est exprimer: «Ceci entité a une propriété qui est un référence à une instance d'un autre entité »et utilisez un champ de clé étrangère pour représenter cette relation.
En d'autres termes, l'utilisation d'un many-to-one
permet de mapper les associations de clé étrangère un-à-un (qui sont en fait peut-être plus fréquentes que les associations un-à-un de clé primaire partagée ).
La plus grande différence réside dans le fait qu’avec un mappage clé partagée un-à-un, les 2 objets sont liés, ils existent ensemble.
f.e. si vous créez une classe Person et une classe Address liées à des tables portant le même nom, chaque personne aura exactement une adresse ...
Avec la relation plusieurs-à-un, la structure de la table change un peu, mais le même effet peut être obtenu ...
... mais encore plus. Maintenant, cette personne peut avoir plusieurs adresses:
Les deux clés étrangères (addressid et shippingaddressid) pourraient pointer vers une seule entrée de base de données ... ou une seule adresse pourrait appartenir à 2 ou 3 personnes. alors ce qui est un plusieurs-à-un du côté de la personne est un un-à-plusieurs du côté de l'adresse.
et devinez juste à quoi ressemble une association un-à-plusieurs avec un seul élément? Ouais, comme un tête-à-tête ...
NOTE: adresse devrait en fait être un objet value, ne devrait pas être partagé dans la base de données (donc c'est un exemple idiot, mais je suppose que ce sera o.k.)
Donc en bref:
Je dirais que le problème est fondamentalement lié au déséquilibre impédance relation-objet. Pour pouvoir relier les deux représentations d'objet dans une base de données, vous devez avoir une sorte de relation entre leurs tables. Cependant, la base de données ne connaît que la relation 1: N: tous les autres en sont dérivés.
Avec les bases de données relationnelles et les langages objets, il appartient au développeur de trouver la représentation la moins anormale du concept qu'il/elle souhaite représenter (dans ce cas, une relation 1: 1).
Si j'ai bien compris, l'hibernation nécessite que la clé primaire des deux objets corresponde dans une relation 1: 1. Many to 1 évite cette exigence.
Cependant beaucoup perdent l’information qu’il ne devrait y avoir qu’un seul objet, voire aucun.
C'est même dans les documents officiels d'Hibernate: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/associations.html#assoc-bidirectional-121 .
Ce n'est pas totalement déraisonnable. La fin de many-to-one dit: Je suis mappé via l'une de mes colonnes sur un ID de la fin unique. Vous utiliseriez exactement le même schéma de base de données pour plusieurs-à-un.