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 .