2012-12-14 4 views
1

J'ai des questions sur les avantages de l'utilisation d'une association un-à-un sur clé étrangère ou un-à-un -une association sur la clé primaire, j'ai lu la documentation d'hibernate disponible à: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html#assoc-unidirectional-121 quelqu'un peut-il me dire avec des détails le plus d'utiliser la première ou la deuxième mise en œuvre?hiberner one-to-one (sur clé étrangère) vs one-to-one (sur clé primaire)

une autre question, j'ai une relation unidirectionnelle un-à-un entre l'utilisateur et le périmètre (Utilisateur ----> Périmètre) et je veux utiliser l'association basée sur la clé étrangère. puis-je inverser la direction dans (utilisateur < ---- périmètre) afin que l'utilisateur de la table reste intacte? Je pense que ce n'est pas raisonnable (perimeter.getUser() !!!) mais techniquement c'est possible?

Répondre

3

En plus des avantages mentionnés par JB Nizet et grâce à une autre personne m'a dit que celui-to-one basé sur clé étrangère est plus flexible. considérons que j'utilise un un-à-un sur la clé étrangère (utilisateur < --- périmètre), si les exigences de l'application change pour avoir besoin de plusieurs utilisateurs pour n'importe quel périmètre, si j'ai partagé la clé primaire, j'aurai beaucoup plus de refactoring à faire. Mais comme je l'ai utilisé la clé étrangère, tout ce que je fais est de se détendre la contrainte unique;)

3

Je vois deux avantages

  • Avoir le choix vous permet de mapper des schémas existants, ce qu'ils ont choisi comme stratégie
  • en utilisant une clé étrangère dans un pointage à l'ID dans B, Hibernate sait qu'il ya non B pour un A donné si la clé étrangère est nulle. Il ne peut pas savoir que lorsque les clés primaires sont utilisées. Il est donc plus efficace d'utiliser une clé étrangère si l'association est facultative.

Pour votre deuxième question, oui, bien sûr que c'est possible. On appelle cela une association OneToOne bidirectionnelle:

public class User { 
    // ... 

    @OneToOne 
    @JoinColumn 
    private Perimeter perimeter; 
} 

public class Perimeter { 
    // ... 

    @OneToOne(mappedBy = "perimeter") 
    private User user; 
} 
+0

mais pour ma deuxième question je ne veux pas de relation bidirectionnelle, juste la direction User <- Perimeter car (je me réfère au mapping xml dans la documentation hibernate je ne connais pas très bien les annotations) bidirectionnel oblige moi à ajouter une colonne dans la table User mais je ne veux pas toucher la table User –

+0

Faire une association bidirectionnelle ne change rien au schéma. Si vous souhaitez que la table de périmètre contienne la colonne de jointure au lieu de la table utilisateur, faites-le simplement. –

1

une à une relation à l'aide d'association clé primaire

Dans cette association one-to-one relations se produit lorsqu'une entité est lié à exactement une occurrence dans une autre entité.

ici est le lien par exemple: primary key association

relation un à un à l'aide de l'association clé étrangère

Dans le même exemple faire les modifications suivantes:

En StockDetail.java

private Integer stockDetailsId; 
    //with setter and getter 
    //remove stockId and it's setter and getter 

en stock.hbm.xml

<id name="stockId" type="java.lang.Integer"> 
       <column name="STOCK_ID" /> 
       <generator class="assigned" /> 
     </id> 

dans StockDetail.hbm.xml

<id name="stockDetailsId" type="java.lang.Integer"> 
       <column name="STOCK_DETAILS_ID" /> 
       <generator class="assigned"/> 
    </id> 
    <many-to-one name="stock" 

    class="com.test.common.Stock" column="STOCK_ID" /> 

dans hibernate.cfg.tout d'abord merci pour votre réponse, j'ai compris les deux avantages. xml

//this is optional property if you want to create database table's according to your hbm file's. 

    <property name="hibernate.hbm2ddl.auto">create</property> 
Questions connexes