Gyűjtemények listája
Nos, láttad, hogyan lehet egyszerű típusokat feltérképezni. Itt az ideje, hogy továbblépjünk az érdekesebb kérdésekre – hogyan térképezzük fel az objektumgyűjteményeket.
És objektumaink 5 csoportban lehetnek:
- Array - objektumok tömbje
- Lista - objektumok listája
- Készlet - objektumok halmaza
- Térkép - tárgyak szótára
- Gyűjtemény - tárgyak gyűjteménye
És egy példa egy gyűjtőmezővel rendelkező osztályra:
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@magical-annotation
public List messages;
}
Tehát mi ez a varázslatos annotáció, amely lehetővé teszi, hogy ne egy mezőt, hanem sok értéket tároljunk?
Ezt a megjegyzést @ElementCollection néven hívják . Példa:
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@ElementCollection
public List<String> messages;
}
Nagyon egyszerűen van megírva, de nem triviálisan működik.
Segédasztal
Az Entity osztály minden olyan mezője, amely sok elemet tartalmaz és @ElementCollection annotációval van megjelölve , az adatbázisban egy speciális segédtáblázatban található. Ami tulajdonképpen logikus is.
Ez a táblázat kétféle formában tartalmazhat adatokat:
- A rendezett (lista, térkép) három oszlopot tartalmaz:
- Kulcsoszlop (idegen kulcs) – hivatkozás a szülőobjektum azonosítójára.
- Index oszlop - pozíció/index a gyűjteményben.
- Elem Oszlop - érték.
- Az Unordered (Set) két oszlopot tartalmaz:
- Kulcsoszlop (idegen kulcs) – hivatkozás a szülőobjektum azonosítójára.
- Elem Oszlop - érték.
A táblázat nevét kifejezetten beállíthatja egy megjegyzés segítségével:
@CollectionTable(name="table_name")
Példa:
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@ElementCollection
@CollectionTable(name="user_message")
public List<String> messages;
}
Fontos! Ha a @CollectionTable megjegyzés nincs megadva, akkor a Hibernate magát a táblanevet építi fel az osztálynév és a mezőnév alapján: a felhasználói osztály és a mezőüzeneteknevezze el a táblát "User_messages"-nek.
Gyűjtemény Gyűjtemény
De ne hagyjuk a segédtábla létrehozását a Hibernate-ra, és magunk készítsük el. Először létre kell hoznunk egy táblázatot két oszlopból:
CREATE TABLE user_message {
user_id INT,
message VARCHAR(255)
};
Vegye figyelembe, hogy ennek a táblázatnak nincs saját azonosító oszlopa. Ez a segédasztalok fő jellemzője. Kicsit később megismerkedhet más típusú segédasztalokkal.
Most ezt a táblázatot kell leképeznünk a mi területünkreüzeneteka User osztályban . Ez így fog kinézni:
@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;
}
Itt két dologra érdemes odafigyelni.
Először is, a @Column(name = "message") megjegyzéssel megadott üzenetoszlop a user_message segédtáblázatban található, nem a felhasználói táblában.
Másodszor, a @JoinColumn(name = "user_id") megjegyzésben megadtuk a user_id oszlop nevét, amely a felhasználói tábla azonosítójára utal. Ez azért van így, hogy a Hibernate tudja, hogyan kell ezeket helyesen kombinálni.
Gyűjtemény
Ha egy lista vagy tömb rendezett elemeit egy segédtáblázatban szeretné tárolni, akkor szüksége van egy három oszlopos táblázatra:
CREATE TABLE user_message {
user_id INT,
index INT,
message VARCHAR(255)
};
Ha nem tetszik az „index” oszlopnév, vagy nem tudja megváltoztatni, a leképezés során megadhat másik nevet. Ehhez az @Index annotációt kell használnia .
Példa:
@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;
}
Térképgyűjtemény
És végül nem csak egy gyűjteményt, hanem egy HashMap-et szeretne tárolni, és ehhez két oszlopra van szüksége egy segédtáblázatban:
CREATE TABLE user_message {
user_id INT,
key VARCHAR(255),
message VARCHAR(255)
};
Ahhoz, hogy kulcsot adjon meg egy térképhez, szüksége van a @MapKeyColumn megjegyzésre .
Példa:
@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;
}
GO TO FULL VERSION