Mapping JPA

Entités et Composants

adriencaubel.fr

Introduction

  • Nous avons introduit la spécification JPA

    • EntityManager et les opérations persist, remove, find ...
    • Cycle de vie d'une entité
    • Gestion des transactions

  • Maintenant, intéressons nous au Mapping Objet/Relationnel

    • Partie 1 : notion d'entité
    • Partie 2 : les associations

Impedance mismatch

L'impédance mismatch fait référence aux incompatibilités ou divergences conceptuelles et techniques entre la POO et les Bases de données relationnelles

(POO) Bases Relationnelles
Héritage 1:1
List 1:n ou n:1
Map n:n

Impedance mismatch

  • Par exemple on peut se demander comment de l’héritage en OO va-t-il être transformer en BDD ?
    • C'est au programmeur de résoudre ce problème
    • Heureusement, nous pouvons tirer parti d’un ORM (Object-Relational Mapping)

Les ORM permettent de créer une correspondance entre un modèle objet et un modèle relationnel de base de données

Entité JPA

// définit l'entité mappant la table « sport » dans le schéma par défaut
@Entity
@Table(name = "t_sport")
public class Sport implements Serializable {
    // définit la clé primaire
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    // l'attribut « intitule » mappe la colonne « intitule » : optionnel car ont
    // le même nom, le mapping se ferait implicitement et par défaut
    @Column(name = "intitule")
    private String intitule;
}

Entité JPA - Entité et Table

  • @Entity, définit une classe comme étant une entité EJB dont les instances pourront être rendues persistantes
  • @Table(name = "t_sport") (optionnelle)

Par défaut le défaut de la nom de la table sera le nom de la classe

Entité JPA - Key

  • @Id, si l’attribut est un identifiant d’objet
  • @GeneratedValue, comment la clé primaire sera générée

Entité JPA - Colonnes

  • @Column (optionnelle) permet de préciser plusieurs paramètre

  • Plusieurs paramètre

    • name indique le nom de la colonne dans la table;
    • length indique la taille maximale de la valeur de la propriété;
    • nullable (false ou true) indique si la colonne accepte ou non des valeurs à NULL
    • unique indique que la valeur de la colonne est unique
@Column(name = "email", length = 255, nullable = false, unique = true)
private String email;

Composant (Embeddable)

Un composant, au contraire, est un objet sans identifiant, qui ne peut être persistant que par rattachement à une entité.

  • Réutilisable dans plusieurs entités
  • Pas de table séparée
  • Mappage intégré dans la table principale
  • Permet de structurer des données complexes

Composant - Exemple

Societe
| id  | ... | rue | ville | code_postal |
|     |     |     |       |             |

Client
| id  | ... | rue | ville | code_postal |
|     |     |     |       |             |

Via les composants nous n’avons pas à écrire l’ensemble des attributs dans nos deux classes Java mais pouvons coder une classe Adresse

Composant - Exemple

@Embeddable
public class Adresse {
    @Column(name = "rue")
    private String rue;
    
    @Column(name = "ville")
    private String ville;
    
    @Column(name = "code_postal")
    private String codePostal;
}
@Entity
public class Client {
    @Id
    private Long id;
    private String nom;
    
    @Embedded
    private Adresse adresse;
}
 
@Entity
public class Societe {
    @Id
    private Long id;
    private String nomEntreprise;
    
    @Embedded
    private Adresse adresse;
}