Daftar koleksi

Nah, Anda telah melihat cara memetakan tipe sederhana. Sekarang saatnya beralih ke pertanyaan yang lebih menarik - bagaimana memetakan kumpulan objek.

Dan kita dapat memiliki objek dalam 5 grup:

  • Larik - larik objek
  • Daftar - daftar objek
  • Set - set objek
  • Peta - kamus objek
  • Koleksi - kumpulan benda

Dan contoh kelas dengan bidang koleksi:

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

   @magical-annotation
   public List messages;
}

Jadi apa anotasi ajaib ini yang memungkinkan kita menyimpan bukan hanya satu bidang, tetapi banyak nilai?

Anotasi ini disebut @ElementCollection . Contoh:

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

   @ElementCollection
   public List<String> messages;
}

Ini ditulis dengan sangat sederhana, tetapi berfungsi dengan tidak sepele.

Meja bantu

Semua bidang kelas Entitas yang berisi banyak elemen dan ditandai dengan anotasi @ElementCollection terdapat dalam database dalam tabel tambahan khusus. Yang sebenarnya logis.

Tabel ini dapat berisi data dalam dua bentuk:

  • Dipesan (Daftar, Peta) berisi tiga kolom:
    • Kolom Kunci (Kunci Asing) – referensi ke ID objek induk.
    • Kolom Indeks - posisi/indeks dalam koleksi.
    • Kolom Elemen - nilai.
  • Unordered (Set) berisi dua kolom:
    • Kolom Kunci (Kunci Asing) – referensi ke ID objek induk.
    • Kolom Elemen - nilai.

Anda juga dapat menetapkan nama tabel ini secara eksplisit menggunakan anotasi:

@CollectionTable(name="table_name")

Contoh:

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

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

Penting! Jika anotasi @CollectionTable tidak ditentukan, maka Hibernate akan membuat nama tabel itu sendiri berdasarkan nama kelas dan nama bidang: kelas Pengguna dan bidangpesanberi nama tabel "User_messages".

Koleksi Koleksi

Tapi jangan tinggalkan pembuatan tabel tambahan untuk Hibernasi dan buat sendiri. Pertama kita perlu membuat tabel dengan dua kolom:

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

Perhatikan bahwa tabel ini tidak memiliki kolom id sendiri. Ini adalah fitur utama tabel tambahan. Anda akan berkenalan dengan jenis tabel tambahan lainnya nanti.

Sekarang kita perlu memetakan tabel ini ke bidang kitapesandi kelas Pengguna . Ini akan terlihat seperti ini:

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

Di sini perlu memperhatikan dua hal.

Pertama, kolom pesan, ditentukan dengan anotasi @Column(name = "message") , ada di tabel tambahan user_message, bukan tabel pengguna.

Kedua, di anotasi @JoinColumn(name = "user_id") , kami menentukan nama kolom user_id, yang mengacu pada id tabel pengguna. Ini agar Hibernate tahu cara menggabungkannya dengan benar.

Koleksi

Jika Anda ingin menyimpan elemen terurut dari daftar atau larik dalam tabel tambahan, maka Anda memerlukan tabel dengan tiga kolom:

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

Jika Anda tidak menyukai nama kolom "indeks", atau Anda tidak dapat mengubahnya, Anda dapat menentukan nama yang berbeda selama pemetaan. Untuk melakukannya, Anda perlu menggunakan anotasi @Index .

Contoh:

@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

Dan terakhir, Anda ingin menyimpan bukan hanya koleksi, tetapi juga HashMap, dan Anda memerlukan dua kolom dalam tabel tambahan untuk itu:

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

Untuk menentukan kunci Peta, Anda memerlukan anotasi @MapKeyColumn .

Contoh:

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

Anda dapat menemukan informasi lebih lanjut di dokumentasi resmi .