JPA-Entitäten definieren

1. Einleitung

In diesem Lernprogramm lernen wir die Grundlagen von Entitäten sowie verschiedene Anmerkungen zum Definieren und Anpassen einer Entität in JPA kennen.

2. Entität

Entitäten in JPA sind nichts anderes als POJOs, die Daten darstellen, die in der Datenbank gespeichert werden können. Eine Entität repräsentiert eine in einer Datenbank gespeicherte Tabelle. Jede Instanz einer Entität repräsentiert eine Zeile in der Tabelle.

2.1. Die Entity Annotation

Angenommen, wir haben ein POJO namens Student, das die Daten eines Studenten darstellt, und wir möchten sie in der Datenbank speichern.

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

Zu diesem Zweck sollten wir eine Entität definieren, damit JPA davon Kenntnis hat.

Definieren wir es also mithilfe der Annotation @Entity . Wir müssen diese Annotation auf Klassenebene angeben. Wir müssen auch sicherstellen, dass die Entität einen Konstruktor ohne Argumente und einen Primärschlüssel hat:

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

Der Entitätsname ist standardmäßig der Name der Klasse. Wir können seinen Namen mit dem name- Element ändern .

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

Da verschiedene JPA-Implementierungen versuchen, unsere Entität in Unterklassen zu unterteilen, um ihre Funktionalität bereitzustellen, dürfen Entitätsklassen nicht als endgültig deklariert werden .

2.2. Die ID- Anmerkung

Jede JPA-Entität muss über einen Primärschlüssel verfügen, der sie eindeutig identifiziert. Die Annotation @Id definiert den Primärschlüssel. Wir können die Bezeichner auf verschiedene Arten generieren, die durch die Annotation @GeneratedValue angegeben werden .

Mit dem Strategieelement können wir aus vier Strategien zur ID-Generierung auswählen . Der Wert kann AUTO, TABLE, SEQUENCE oder IDENTITY sein.

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

Wenn wir GenerationType angeben . AUTO , der JPA-Anbieter verwendet jede Strategie, mit der er die Kennungen generieren möchte.

Wenn wir die Felder der Entität mit Anmerkungen versehen, verwendet der JPA-Anbieter diese Felder, um den Status der Entität abzurufen und festzulegen. Zusätzlich zum Feldzugriff können wir auch den Eigenschaftszugriff oder den gemischten Zugriff ausführen, wodurch wir sowohl den Feldzugriff als auch den Eigenschaftszugriff in derselben Entität verwenden können .

2.3. Die Tabelle Annotation

In den meisten Fällen sind der Name der Tabelle in der Datenbank und der Name der Entität nicht identisch.

In diesen Fällen können wir den Tabellennamen mithilfe der Annotation @Table angeben :

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

Wir können das Schema auch mit dem Schemaelement erwähnen :

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

Der Schemaname hilft dabei, einen Satz von Tabellen von einem anderen zu unterscheiden.

Wenn wir die Annotation @Table nicht verwenden , wird der Name der Entität als Name der Tabelle betrachtet.

2.4. Die Spalte Annotation

Genau wie bei der Annotation @Table können wir die Annotation @Column verwenden , um die Details einer Spalte in der Tabelle zu erwähnen.

Die @ Column- Annotation enthält viele Elemente wie Name, Länge, Nullwert und Eindeutigkeit .

@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 }

Das name- Element gibt den Namen der Spalte in der Tabelle an. Die Länge Element gibt seine Länge. Das nullbare Element gibt an, ob die Spalte nullwertfähig ist oder nicht, und das eindeutige Element gibt an, ob die Spalte eindeutig ist.

Wenn wir diese Anmerkung nicht angeben, wird der Name des Feldes als Name der Spalte in der Tabelle betrachtet.

2.5. Die vorübergehende Annotation

Manchmal möchten wir ein Feld möglicherweise nicht persistent machen. Wir können dazu die Annotation @Transient verwenden. Es gibt an, dass das Feld nicht beibehalten wird.

Zum Beispiel können wir das Alter eines Schülers ab dem Geburtsdatum berechnen.

Also lassen Sie sich das Feld mit Anmerkungen versehenes Alters mit der @Transient Anmerkung:

@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 }

Als Ergebnis wird das Feld Alter nicht auf die Tabelle beibehalten werden.

2.6. Die zeitliche Anmerkung

In einigen Fällen müssen wir möglicherweise zeitliche Werte in unserer Tabelle speichern.

Dafür haben wir die 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 }

Mit JPA 2.2 unterstützen wir jedoch auch java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime, java.time.OffsetTime und java.time.OffsetDateTime.

2.7. Die aufgezählte Anmerkung

Manchmal möchten wir möglicherweise einen Java- Aufzählungstyp beibehalten .

Wir können die Annotation @Enumerated verwenden, um anzugeben, ob die Aufzählung nach Namen oder nach Ordnungszahl (Standard) beibehalten werden soll.

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 }

Tatsächlich müssen wir die Annotation @Enumerated überhaupt nicht angeben, wenn wir das Geschlecht durch die Ordnungszahl der Aufzählung beibehalten möchten .

Um das Geschlecht nach Enum- Namen beizubehalten , haben wir die Annotation mit EnumType.STRING konfiguriert.

3. Fazit

In diesem Artikel haben wir gelernt, was JPA-Entitäten sind und wie sie erstellt werden. Wir haben auch die verschiedenen Anmerkungen kennengelernt, mit denen die Entität weiter angepasst werden kann.

Den vollständigen Code für diesen Artikel finden Sie auf Github.