Liste over samlinger

Vel, du har sett hvordan du kartlegger enkle typer. Nå er det på tide å gå videre til mer interessante spørsmål - hvordan kartlegge samlinger av gjenstander.

Og vi kan ha objekter i 5 grupper:

  • Array - en rekke objekter
  • Liste - liste over objekter
  • Sett - sett med objekter
  • Kart - en ordbok over objekter
  • Samling - en samling av gjenstander

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å hva er denne magiske merknaden som vil tillate oss å lagre ikke ett felt, men mange verdier?

Denne merknaden kalles @ElementCollection . Eksempel:

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

   @ElementCollection
   public List<String> messages;
}

Det er skrevet veldig enkelt, men det fungerer ikke-trivielt.

Hjelpebord

Alle felt i Entity-klassen som inneholder mange elementer og er merket med @ElementCollection- kommentaren , er inneholdt i databasen i en spesiell hjelpetabell. Noe som faktisk er logisk.

Denne tabellen kan inneholde data i to former:

  • Bestilt (liste, kart) inneholder tre kolonner:
    • Nøkkelkolonne (fremmednøkkel) – referanse til ID-en til det overordnede objektet.
    • Indekskolonne - posisjon/indeks i samlingen.
    • Elementkolonne - verdi.
  • Uordnet (sett) inneholder to kolonner:
    • Nøkkelkolonne (fremmednøkkel) – referanse til ID-en til det overordnede objektet.
    • Elementkolonne - verdi.

Du kan også angi navnet på denne tabellen eksplisitt ved å bruke en merknad:

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

Viktig! Hvis @CollectionTable- kommentaren ikke er spesifisert, vil Hibernate bygge selve tabellnavnet basert på klassenavnet og feltnavnet: Brukerklassen og feltetmeldingergi tabellen navnet "Brukermeldinger".

Samling Samling

Men la oss ikke overlate opprettelsen av hjelpebordet til Hibernate og lage det selv. Først må vi lage en tabell med to kolonner:

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

Merk at denne tabellen ikke har sin egen id-kolonne. Dette er hovedtrekket til hjelpetabeller. Du vil bli kjent med andre typer hjelpebord litt senere.

Nå må vi kartlegge denne tabellen til vårt feltmeldingeri brukerklassen . Dette vil se slik ut:

@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 verdt å være oppmerksom på to ting.

For det første er meldingskolonnen, spesifisert med @Column(navn = "melding") -kommentaren , i hjelpetabellen user_message, ikke brukertabellen.

For det andre, i @JoinColumn(name = "user_id") -kommentaren spesifiserte vi navnet på user_id-kolonnen, som refererer til ID-en til brukertabellen. Dette er slik at Hibernate vet hvordan de skal kombineres riktig.

Samling

Hvis du vil lagre de ordnede elementene i en liste eller matrise i en hjelpetabell, trenger du en tabell med tre kolonner:

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

Hvis du ikke liker kolonnenavnet "indeks", eller du ikke kan endre det, kan du angi et annet navn under kartleggingen. For å gjøre dette må du bruke @Index- kommentaren .

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

Kartsamling

Og til slutt vil du lagre ikke bare en samling, men et HashMap, og du trenger to kolonner i en hjelpetabell for det:

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

For å spesifisere en nøkkel for et kart, trenger du @MapKeyColumn -kommentaren .

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 finner mer informasjon i den offisielle dokumentasjonen .