Définition d'entités JPA

1. Introduction

Dans ce didacticiel, nous découvrirons les bases des entités ainsi que diverses annotations qui définissent et personnalisent une entité dans JPA.

2. Entité

Les entités dans JPA ne sont rien d'autre que des POJO représentant des données qui peuvent être conservées dans la base de données. Une entité représente une table stockée dans une base de données. Chaque instance d'une entité représente une ligne dans la table.

2.1. L' annotation d' entité

Disons que nous avons un POJO appelé Student qui représente les données d'un étudiant et que nous aimerions les stocker dans la base de données.

public class Student { // fields, getters and setters }

Pour ce faire, nous devons définir une entité afin que JPA en soit consciente.

Définissons-le donc en utilisant l' annotation @Entity . Nous devons spécifier cette annotation au niveau de la classe. Nous devons également nous assurer que l'entité a un constructeur sans argument et une clé primaire:

@Entity public class Student { // fields, getters and setters }

Le nom de l'entité correspond par défaut au nom de la classe. Nous pouvons changer son nom en utilisant l' élément name .

@Entity(name="student") public class Student { // fields, getters and setters }

Étant donné que diverses implémentations JPA essaieront de sous-classer notre entité afin de fournir leurs fonctionnalités, les classes d'entité ne doivent pas être déclarées finales .

2.2. L' annotation d' ID

Chaque entité JPA doit avoir une clé primaire qui l'identifie de manière unique. L' annotation @Id définit la clé primaire. Nous pouvons générer les identifiants de différentes manières qui sont spécifiées par l' annotation @GeneratedValue .

Nous pouvons choisir parmi quatre stratégies de génération d'identifiants avec l' élément de stratégie . La valeur peut être AUTO, TABLE, SEQUENCE ou IDENTITY.

@Entity public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String name; // getters and setters }

Si nous spécifions GenerationType . AUTO , le fournisseur JPA utilisera toute stratégie qu'il souhaite pour générer les identifiants.

Si nous annotons les champs de l'entité, le fournisseur JPA utilisera ces champs pour obtenir et définir l'état de l'entité. En plus de Field Access, nous pouvons également faire un accès aux propriétés ou un accès mixte, ce qui nous permet d'utiliser à la fois l'accès aux champs et aux propriétés dans la même entité .

2.3. L' annotation de table

Dans la plupart des cas, le nom de la table dans la base de données et le nom de l'entité ne seront pas les mêmes.

Dans ces cas, nous pouvons spécifier le nom de la table à l'aide de l' annotation @Table :

@Entity @Table(name="STUDENT") public class Student { // fields, getters and setters }

On peut également mentionner le schéma à l'aide de l' élément schema :

@Entity @Table(name="STUDENT", schema="SCHOOL") public class Student { // fields, getters and setters }

Le nom du schéma permet de distinguer un ensemble de tables d'un autre,

Si nous n'utilisons pas l' annotation @Table , le nom de l'entité sera considéré comme le nom de la table.

2.4. L' annotation de colonne

Tout comme l' annotation @Table , nous pouvons utiliser l' annotation @Column pour mentionner les détails d'une colonne dans le tableau.

L' annotation @Column comporte de nombreux éléments tels que le nom, la longueur, la valeur Nullable et l'unique .

@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false) private String name; // other fields, getters and setters }

L' élément name spécifie le nom de la colonne dans le tableau. L' élément length spécifie sa longueur. L' élément Nullable spécifie si la colonne est Nullable ou non, et l' élément unique spécifie si la colonne est unique.

Si nous ne spécifions pas cette annotation, le nom du champ sera considéré comme le nom de la colonne dans le tableau.

2.5. L' annotation transitoire

Parfois, nous pouvons vouloir rendre un champ non persistant. Nous pouvons utiliser l' annotation @Transient pour ce faire. Il spécifie que le champ ne sera pas conservé.

Par exemple, nous pouvons calculer l'âge d'un étudiant à partir de sa date de naissance.

Annotons donc l' âge du champ avec l' annotation @Transient :

@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false) private String name; @Transient private Integer age; // other fields, getters and setters }

Par conséquent, l' âge du champ ne sera pas conservé dans la table.

2.6. L' annotation temporelle

Dans certains cas, il se peut que nous devions enregistrer des valeurs temporelles dans notre table.

Pour cela, nous avons l' annotation @Temporal :

@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false) private String name; @Transient private Integer age; @Temporal(TemporalType.DATE) private Date birthDate; // other fields, getters and setters }

Cependant, avec JPA 2.2, nous prenons également en charge java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime, java.time.OffsetTime et java.time.OffsetDateTime.

2.7. L' annotation énumérée

Parfois, nous souhaitons conserver un type enum Java .

Nous pouvons utiliser l' annotation @Enumerated pour spécifier si l' énumération doit être persistée par nom ou par ordinal (par défaut).

public enum Gender { MALE, FEMALE } 
@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false) private String name; @Transient private Integer age; @Temporal(TemporalType.DATE) private Date birthDate; @Enumerated(EnumType.STRING) private Gender gender; // other fields, getters and setters }

En fait, nous n'avons pas du tout à spécifier l' annotation @Enumerated si nous voulons conserver le Gender par l' ordinal de l' énumération .

Cependant, pour conserver le sexe par nom d' énumération , nous avons configuré l'annotation avec EnumType.STRING.

3. Conclusion

Dans cet article, nous avons appris ce que sont les entités JPA et comment les créer. Nous avons également découvert les différentes annotations qui peuvent être utilisées pour personnaliser davantage l'entité.

Le code complet de cet article est disponible à l'adresse over sur Github.