Senarai koleksi

Nah, anda telah melihat cara memetakan jenis mudah. Kini tiba masanya untuk beralih kepada soalan yang lebih menarik - bagaimana untuk memetakan koleksi objek.

Dan kita boleh mempunyai objek dalam 5 kumpulan:

  • Array - susunan objek
  • Senarai - senarai objek
  • Set - set objek
  • Peta - kamus objek
  • Koleksi - koleksi objek

Dan contoh kelas dengan medan koleksi:

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

   @magical-annotation
   public List messages;
}

Jadi apakah anotasi ajaib ini yang membolehkan kita menyimpan bukan satu medan, tetapi banyak nilai?

Anotasi ini dipanggil @ElementCollection . Contoh:

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

   @ElementCollection
   public List<String> messages;
}

Ia ditulis dengan sangat ringkas, tetapi ia berfungsi bukan remeh.

Meja bantu

Semua medan kelas Entiti yang mengandungi banyak elemen dan ditandakan dengan anotasi @ElementCollection terkandung dalam pangkalan data dalam jadual tambahan khas. Yang, sebenarnya, adalah logik.

Jadual ini boleh mengandungi data dalam dua bentuk:

  • Tertib (Senarai, Peta) mengandungi tiga lajur:
    • Lajur Utama (Kunci Asing) – merujuk kepada ID objek induk.
    • Lajur Indeks - kedudukan/indeks dalam koleksi.
    • Lajur Elemen - nilai.
  • Tidak Tertib (Set) mengandungi dua lajur:
    • Lajur Utama (Kunci Asing) – merujuk kepada ID objek induk.
    • Lajur Elemen - nilai.

Anda juga boleh menetapkan nama jadual 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 membina nama jadual itu sendiri berdasarkan nama kelas dan nama medan: kelas Pengguna dan medanmesejnamakan jadual "User_messages".

Koleksi Koleksi

Tetapi jangan biarkan penciptaan jadual tambahan kepada Hibernate dan buat sendiri. Mula-mula kita perlu membuat jadual dengan dua lajur:

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

Ambil perhatian bahawa jadual ini tidak mempunyai lajur id sendiri. Ini adalah ciri utama jadual tambahan. Anda akan berkenalan dengan jenis meja tambahan yang lain sedikit kemudian.

Sekarang kita perlu memetakan jadual ini ke medan kitamesejdalam kelas Pengguna . Ini akan kelihatan 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 ia patut memberi perhatian kepada dua perkara.

Pertama, lajur mesej, yang dinyatakan dengan anotasi @Column(name = "message") , berada dalam jadual tambahan user_message, bukan jadual pengguna.

Kedua, dalam anotasi @JoinColumn(name = "user_id") , kami menyatakan nama lajur user_id, yang merujuk kepada id jadual pengguna. Ini supaya Hibernate tahu cara menggabungkannya dengan betul.

Koleksi

Jika anda ingin menyimpan elemen tertib senarai atau tatasusunan dalam jadual tambahan, maka anda memerlukan jadual dengan tiga lajur:

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

Jika anda tidak menyukai nama lajur "indeks", atau anda tidak boleh menukarnya, anda boleh menentukan nama lain semasa pemetaan. Untuk melakukan ini, 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 akhirnya, anda ingin menyimpan bukan sahaja koleksi, tetapi HashMap, dan anda memerlukan dua lajur dalam jadual tambahan untuknya:

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

Untuk menentukan kunci untuk 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 boleh mendapatkan maklumat lanjut dalam dokumentasi rasmi .