Différence entre @JoinColumn et mappedBy

Différence entre @JoinColumn et mappedBy

1. introduction

Les relations JPA peuvent être unidirectionnelles ou bidirectionnelles. Cela signifie simplement que nous pouvons les modéliser sous forme d'attribut sur exactement l'une des entités associées, ou les deux.

Définir la direction de la relation entre les entités n'a aucun impact sur le mappage de la base de données. Elle définit uniquement les directions dans lesquelles nous utilisons cette relation dans notre modèle de domaine.

Pour une relation bidirectionnelle, nous définissons généralement:

  • le côté propriétaire

  • inverse ou du côté du référencement

L'annotation@JoinColumn nous aide à spécifier la colonne que nous utiliserons pour joindre une association d'entités ou une collection d'éléments. D'autre part, l'attributmappedBy est utilisé pour définir le côté de référence (côté non propriétaire) de la relation.

Dans ce rapide didacticiel, nous examineronsthe difference between @JoinColumn and mappedByin JPA. We’ll also present how to use them in a one-to-many association.

2. La configuration initiale

Pour suivre ce didacticiel, disons que nous avons deux entités:Employee etEmail.

Clairement, un employé peut avoir plusieurs adresses électroniques. Toutefois, une adresse électronique donnée peut appartenir à un seul employé.

Cela signifie qu'ils partagent une association un à plusieurs:

image

Toujours dans notre modèle SGBDR, nous aurons une clé étrangèreemployee_id dans notre entitéEmail faisant référence à l'attributid d'unEmployee.

3. Annotation@JoinColumn

Dans une relation un-à-plusieurs / plusieurs-à-un,the owning side is usually defined on the ‘many' side of the relationship. C'est généralement le côté qui possède la clé étrangère.

L'annotation@JoinColumn définit ce mappage physique réel du côté propriétaire:

@Entity
public class Email {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "employee_id")
    private Employee employee;

    // ...

}

Cela signifie simplement que notre entitéEmail aura une colonne de clé étrangère nomméeemployee_id faisant référence à l'attribut principalid de notre entitéEmployee.

4. AttributmappedBy

Une fois que nous avons défini le côté propriétaire de la relation, Hibernate dispose déjà de toutes les informations nécessaires pour mapper cette relation dans notre base de données. Pour rendre cette association bidirectionnelle, il suffit de définir le côté de référencement. L'inverse ou le côté du référencement est simplement mappé sur le côté propriétaire.

Nous pouvons facilement utiliser l'attributmappedBy de l'annotation@OneToMany pour ce faire. Alors, définissons notre entitéEmployee:

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
    private List emails;

    // ...
}

Ici,the value of mappedBy is the name of the association-mapping attribute on the owning side. Avec cela, nous avons maintenant établi une association bidirectionnelle entre nos entitésEmployee etEmail.

5. Conclusion

Dans ce didacticiel, nous avons examiné la différence entre@JoinColumn etmappedBy et comment les utiliser dans une relation bidirectionnelle un-à-plusieurs.

L'annotation@JoinColumn définit le mappage physique réel du côté propriétaire. D'autre part, le côté de référencement est défini à l'aide de l'attributmappedBy de l'annotation@OneToMany.

Comme d'habitude, le code source est disponibleover on Github.