Liste over samlinger

Nå, du har set, hvordan man kortlægger simple typer. Nu er det tid til at gå videre til mere interessante spørgsmål - hvordan man kortlægger samlinger af objekter.

Og vi kan have objekter i 5 grupper:

  • Array - en række af objekter
  • Liste - liste over objekter
  • Sæt - sæt af objekter
  • Kort - en ordbog over objekter
  • Samling - en samling af genstande

Og et eksempel på en klasse med et samlingsfelt:

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

   @magical-annotation
   public List messages;
}

Så hvad er denne magiske annotation, der vil tillade os at gemme ikke ét felt, men mange værdier?

Denne annotation kaldes @ElementCollection . Eksempel:

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

   @ElementCollection
   public List<String> messages;
}

Det er skrevet meget enkelt, men det virker ikke-trivielt.

Hjælpebord

Alle felter i Entity-klassen, der indeholder mange elementer og er markeret med @ElementCollection- annotationen , er indeholdt i databasen i en speciel hjælpetabel. Hvilket faktisk er logisk.

Denne tabel kan indeholde data i to former:

  • Ordret (liste, kort) indeholder tre kolonner:
    • Nøglekolonne (fremmednøgle) – reference til det overordnede objekts ID.
    • Indekskolonne - position/indeks i samlingen.
    • Element Kolonne - værdi.
  • Uordnet (sæt) indeholder to kolonner:
    • Nøglekolonne (fremmednøgle) – reference til det overordnede objekts ID.
    • Element Kolonne - værdi.

Du kan også angive navnet på denne tabel eksplicit ved hjælp af en annotering:

@CollectionTable(name="table_name")

Eksempel:

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

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

Vigtig! Hvis @CollectionTable- annotationen ikke er angivet, opbygger Hibernate selve tabelnavnet baseret på klassenavnet og feltnavnet: Brugerklassen og feltetBeskedernavngiv tabellen "Bruger_meddelelser".

Samling Indsamling

Men lad os ikke overlade oprettelsen af ​​hjælpebordet til Hibernate og oprette det selv. Først skal vi lave en tabel med to kolonner:

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

Bemærk, at denne tabel ikke har sin egen id-kolonne. Dette er hovedtræk ved hjælpetabeller. Du vil stifte bekendtskab med andre typer hjælpeborde lidt senere.

Nu skal vi kortlægge denne tabel til vores feltBeskederi brugerklassen . Dette vil se sådan ud:

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

Her er det værd at være opmærksom på to ting.

For det første er meddelelseskolonnen, der er angivet med @Column(name = "meddelelse") annotation , i user_message hjælpetabellen, ikke brugertabellen.

For det andet, i @JoinColumn(name = "user_id") annotation specificerede vi navnet på kolonnen user_id, som refererer til brugertabellens id. Dette er for at Hibernate ved, hvordan man kombinerer dem korrekt.

Kollektion

Hvis du vil gemme de ordnede elementer i en liste eller et array i en hjælpetabel, skal du bruge en tabel med tre kolonner:

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

Hvis du ikke kan lide kolonnenavnet "indeks", eller du ikke kan ændre det, kan du angive et andet navn under tilknytningen. For at gøre dette skal du bruge @Index- annotationen .

Eksempel:

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

Kortsamling

Og endelig vil du ikke bare gemme en samling, men et HashMap, og du skal bruge to kolonner i en hjælpetabel til det:

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

For at angive en nøgle til et kort skal du bruge @MapKeyColumn- annotationen .

Eksempel:

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

Du kan finde mere information i den officielle dokumentation .