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

További információkat a hivatalos dokumentációban talál .