Maison >Java >javaDidacticiel >JoinColumn vs mappedBy dans JPA : quand utiliser quelle annotation ?

JoinColumn vs mappedBy dans JPA : quand utiliser quelle annotation ?

DDD
DDDoriginal
2024-12-21 19:11:11581parcourir

JoinColumn vs. mappedBy in JPA: When to Use Which Annotation?

Comprendre la distinction entre JoinColumn et mappedBy dans JPA

Dans l'API Java Persistence (JPA), la gestion des relations entre les entités est cruciale. Parmi les annotations clés pour établir des relations figurent @JoinColumn et @mappedBy.

Lors de l'utilisation des annotations @OneToMany pour les relations bidirectionnelles, il faut faire la différence entre le côté propriétaire et le côté inverse de la relation. L'utilisation de @JoinColumn du côté propriétaire indique que la table référencée possède une colonne de clé étrangère vers la table correspondante. En revanche, @mappedBy signifie le côté inverse, ce qui implique que l'autre entité agit en tant que propriétaire de la relation et possède une colonne mappée référençant l'entité à l'aide de @mappedBy.

Exemple de code

Considérez les exemples de code suivants :

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    @JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")
    private List<Branch> branches;
    ...
}
@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, 
    mappedBy = "companyIdRef")
    private List<Branch> branches;
    ...
}

Dans le premier exemple, Company est le Le côté propriétaire et les succursales sont référencés via la colonne de clé étrangère companyIdRef. Dans le deuxième exemple, Company est le côté inverse de la relation et les branches sont référencées via la colonne mappée companyIdRef.

Utilisation correcte de l'annotation

Pour le code fourni dans le question, les annotations correctes doivent être :

@Entity
public class Company {
    @OneToMany(mappedBy = "company",
               orphanRemoval = true,
               fetch = FetchType.LAZY,
               cascade = CascadeType.ALL)
    private List<Branch> branches;
}

@Entity
public class Branch {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId")
    private Company company;
}

En utilisant ces annotations, une relation bidirectionnelle est établie entre l'entreprise et Branche, avec Société comme côté inverse et Branche comme côté propriétaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn