Daftar koleksi

Inggih, sampeyan wis weruh carane peta jinis prasaja. Saiki wektune kanggo pindhah menyang pitakonan sing luwih menarik - carane peta koleksi obyek.

Lan kita bisa duwe obyek ing 5 klompok:

  • Array - macem-macem obyek
  • Dhaptar - dhaptar obyek
  • Set - set obyek
  • Peta - kamus obyek
  • Koleksi - koleksi obyek

Lan conto kelas kanthi kolom koleksi:

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

   @magical-annotation
   public List messages;
}

Dadi apa anotasi magis iki sing bakal ngidini kita ora nyimpen siji lapangan, nanging akeh nilai?

Anotasi iki diarani @ElementCollection . Tuladha:

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

   @ElementCollection
   public List<String> messages;
}

Iki ditulis banget prasaja, nanging bisa digunakake non-trivially.

Tabel tambahan

Kabeh lapangan kelas Entitas sing ngemot akeh unsur lan ditandhani karo anotasi @ElementCollection ana ing database ing tabel tambahan khusus. Sing, nyatane, logis.

Tabel iki bisa ngemot data ing rong wujud:

  • Diurut (Dhaptar, Peta) ngemot telung kolom:
    • Kolom Kunci (Kunci Asing) - referensi kanggo ID obyek induk.
    • Kolom Indeks - posisi/indeks ing koleksi.
    • Kolom Unsur - nilai.
  • Unordered (Set) ngemot rong kolom:
    • Kolom Kunci (Kunci Asing) - referensi kanggo ID obyek induk.
    • Kolom Unsur - nilai.

Sampeyan uga bisa nyetel jeneng tabel iki kanthi eksplisit nggunakake anotasi:

@CollectionTable(name="table_name")

Tuladha:

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

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

Penting! Yen anotasi @CollectionTable ora ditemtokake, banjur Hibernate bakal mbangun jeneng tabel dhewe adhedhasar jeneng kelas lan jeneng lapangan: kelas pangguna lan lapanganpesenjeneng tabel "User_messages".

Koleksi Koleksi

Nanging aja ninggalake nggawe meja tambahan kanggo Hibernate lan nggawe dhewe. Pisanan kita kudu nggawe tabel kanthi rong kolom:

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

Elinga yen tabel iki ora duwe id-kolom dhewe. Iki minangka fitur utama tabel tambahan. Sampeyan bakal kenal karo jinis tabel tambahan liyane mengko.

Saiki kita kudu peta tabel iki menyang lapangan kitapesening kelas Panganggo . Iki bakal katon kaya iki:

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

Kene iku worth mbayar manungsa waé kanggo rong bab.

Pisanan, kolom pesen, sing ditemtokake karo @Column(name = "pesen") anotasi , ana ing tabel tambahan user_message, dudu tabel pangguna.

Kapindho, ing @JoinColumn(name = "user_id") anotasi , kita nemtokake jeneng kolom user_id, sing nuduhake id saka tabel pangguna. Iki supaya Hibernate ngerti carane nggabungake kanthi bener.

Koleksi

Yen sampeyan pengin nyimpen unsur sing diurutake saka dhaptar utawa larik ing tabel tambahan, mula sampeyan butuh tabel kanthi telung kolom:

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

Yen sampeyan ora seneng jeneng kolom "indeks", utawa sampeyan ora bisa ngganti, sampeyan bisa nemtokake jeneng liyane sak pemetaan. Kanggo nindakake iki, sampeyan kudu nggunakake @Index anotasi .

Tuladha:

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

Koleksi peta

Lan pungkasane, sampeyan pengin nyimpen ora mung koleksi, nanging HashMap, lan sampeyan butuh rong kolom ing tabel tambahan:

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

Kanggo nemtokake kunci kanggo Peta, sampeyan butuh anotasi @MapKeyColumn .

Tuladha:

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

Sampeyan bisa nemokake informasi luwih lengkap ing dokumentasi resmi .