Liste der Sammlungen

Nun, Sie haben gesehen, wie man einfache Typen zuordnet. Jetzt ist es an der Zeit, sich interessanteren Fragen zuzuwenden – wie man Sammlungen von Objekten kartiert.

Und wir können Objekte in 5 Gruppen haben:

  • Array – ein Array von Objekten
  • Liste – Liste der Objekte
  • Set – Satz von Objekten
  • Karte – ein Wörterbuch von Objekten
  • Sammlung – eine Sammlung von Objekten

Und ein Beispiel für eine Klasse mit einem Sammlungsfeld:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @magical-annotation
   public List messages;
}

Was ist also diese magische Annotation, die es uns ermöglicht, nicht nur ein Feld, sondern viele Werte zu speichern?

Diese Annotation heißt @ElementCollection . Beispiel:

@Entity
@Table(name="user")
class User  {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   public List<String> messages;
}

Es ist sehr einfach geschrieben, funktioniert aber nicht trivial.

Hilfstisch

Alle Felder der Entity-Klasse, die viele Elemente enthalten und mit der Annotation @ElementCollection gekennzeichnet sind , sind in der Datenbank in einer speziellen Hilfstabelle enthalten. Was eigentlich logisch ist.

Diese Tabelle kann Daten in zwei Formen enthalten:

  • Geordnet (Liste, Karte) enthält drei Spalten:
    • Schlüsselspalte (Fremdschlüssel) – Verweis auf die ID des übergeordneten Objekts.
    • Indexspalte – Position/Index in der Sammlung.
    • Elementspalte – Wert.
  • Unordered (Set) enthält zwei Spalten:
    • Schlüsselspalte (Fremdschlüssel) – Verweis auf die ID des übergeordneten Objekts.
    • Elementspalte – Wert.

Sie können den Namen dieser Tabelle auch explizit mithilfe einer Annotation festlegen:

@CollectionTable(name="table_name")

Beispiel:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message")
   public List<String> messages;
}

Wichtig! Wenn die Annotation @CollectionTable nicht angegeben ist, erstellt Hibernate den Tabellennamen selbst basierend auf dem Klassennamen und dem Feldnamen: der Benutzerklasse und dem FeldMitteilungenBenennen Sie die Tabelle „User_messages“.

Sammlung Sammlung

Aber überlassen wir die Erstellung der Hilfstabelle nicht Hibernate und erstellen sie selbst. Zuerst müssen wir eine Tabelle mit zwei Spalten erstellen:

CREATE TABLE user_message {
    user_id INT,
    message VARCHAR(255)
};

Beachten Sie, dass diese Tabelle keine eigene ID-Spalte hat. Dies ist das Hauptmerkmal von Hilfstabellen. Weitere Arten von Hilfstischen werden Sie etwas später kennenlernen.

Jetzt müssen wir diese Tabelle unserem Feld zuordnenMitteilungenin der User- Klasse . Das wird so aussehen:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
   @Column(name = "message")
   public Set<String> messages;
}

Dabei lohnt es sich, auf zwei Dinge zu achten.

Erstens befindet sich die Nachrichtenspalte, die mit der Annotation @Column(name = "message") angegeben wird , in der Hilfstabelle user_message und nicht in der Benutzertabelle.

Zweitens haben wir in der Annotation @JoinColumn(name = „user_id“) den Namen der Spalte „user_id“ angegeben, der sich auf die ID der Benutzertabelle bezieht. Damit Hibernate weiß, wie man sie richtig kombiniert.

Sammlung

Wenn Sie die geordneten Elemente einer Liste oder eines Arrays in einer Hilfstabelle speichern möchten, benötigen Sie eine Tabelle mit drei Spalten:

CREATE TABLE user_message {
    user_id INT,
    index INT,
    message VARCHAR(255)
};

Wenn Ihnen der Spaltenname „index“ nicht gefällt oder Sie ihn nicht ändern können, können Sie beim Mapping einen anderen Namen angeben. Dazu müssen Sie die Annotation @Index verwenden .

Beispiel:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message",
       	indexes = { @Index(columnList = "list_index") }
       	joinColumns = @JoinColumn(name = "user_id"))
   @Column(name = "message")
   public List<String> messages;
}

Kartensammlung

Und schließlich möchten Sie nicht nur eine Sammlung, sondern eine HashMap speichern und benötigen dafür zwei Spalten in einer Hilfstabelle:

CREATE TABLE user_message {
    user_id INT,
    key VARCHAR(255),
    message VARCHAR(255)
};

Um einen Schlüssel für eine Map anzugeben, benötigen Sie die Annotation @MapKeyColumn .

Beispiel:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
   @MapKeyColumn(name = "key")
   @Column(name = "message")
   public Map<String, String> messages;
}

Weitere Informationen finden Sie in der offiziellen Dokumentation .