L’héritage avec Jakarta Persistence

Contrôle de l’héritage avec JPA

Université de Toulon

LIS UMR CNRS 7020

2026-10-01

Annotation @Inheritance

  • JPA supporte plusieurs stratégies d’héritage pour mapper les hiérarchies d’objets en bases de données relationnelles.
  • @Inheritance permet de spécifier la stratégie d’héritage à utiliser pour une hiérarchie de classes.

Figure 1: La hiérarchie des personnes

Une seule relation par hiérarchie

Table unique (Single table) : - Toutes les classes sont mappées à une seule table. - @Inheritance(strategy = InheritanceType.SINGLE_TABLE).

No JDBC connection available. Set system properties 'jdbc.url' (and optionally 'jdbc.user'/'jdbc.password'), or provide a Connection in the kernel environment.
Figure 2
No JDBC connection available. Set system properties 'jdbc.url' (and optionally 'jdbc.user'/'jdbc.password'), or provide a Connection in the kernel environment.

Classe mère

@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Setter
@ToString

@Entity
@Table(schema = "EX_HERITAGE1")
public class Person {
    @Id
    @GeneratedValue
    long id;

    private String name;
}

Classe fille 1

@ToString(callSuper = true)
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Setter

@Entity
public class Student extends Person {
    public enum Status {ACTIVE, ALUMNI}

    private Status status;
}

Classe fille 2

@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(callSuper = true)

@Entity
public class Teacher extends Person {
    private double salary;
}

Une relation par classe (strategies JOINED ou TABLE_PER_CLASS)

  1. Table par classe (Table per class) :
    • Chaque classe est mappée à sa propre table.
    • Spécifié avec @Inheritance(strategy = InheritanceType.JOINED).
  2. Table par sous-classe (Table per subclass) :
    • Chaque classe, y compris les sous-classes, a sa propre table.
    • Défini avec @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS).

Schéma

No JDBC connection available. Set system properties 'jdbc.url' (and optionally 'jdbc.user'/'jdbc.password'), or provide a Connection in the kernel environment.
Figure 3
No JDBC connection available. Set system properties 'jdbc.url' (and optionally 'jdbc.user'/'jdbc.password'), or provide a Connection in the kernel environment.
No JDBC connection available. Set system properties 'jdbc.url' (and optionally 'jdbc.user'/'jdbc.password'), or provide a Connection in the kernel environment.
No JDBC connection available. Set system properties 'jdbc.url' (and optionally 'jdbc.user'/'jdbc.password'), or provide a Connection in the kernel environment.

Classe mère

@Table(name="PERSON", schema = "EX_HERITAGE2")
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Setter
@ToString

@Entity(name="PersonHeritage2")
@Inheritance(strategy = InheritanceType.JOINED)
public class Person {
    @Id
    @GeneratedValue
    long id;

    private String name;
}

Classe fille 1

@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Setter
@ToString(callSuper = true)

@Entity(name="StudentHeritage2")
@Table(name="STUDENT", schema = "EX_HERITAGE2")
public class Student extends Person {
    public enum Status {ACTIVE, ALUMNI}

    @Column(nullable = false)
    private Status status;
}

Classe fille 2

@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Setter
@ToString(callSuper = true)

@Entity(name="TeacherHeritage2")
@Table(name="TEACHER", schema = "EX_HERITAGE2")
public class Teacher extends Person {

    @Column(nullable = false)
    private double salary;
}

Conclusion

  • @JOINED privilégie la normalisation des données en utilisant une table commune pour les propriétés partagées.
  • @TABLE_PER_CLASS favorise l’indépendance des tables pour chaque classe.