koleksiyon listesi

Basit türleri nasıl haritalandıracağınızı gördünüz. Şimdi daha ilginç sorulara geçme zamanı - nesne koleksiyonlarının nasıl haritalandırılacağı.

Ve 5 grupta nesnelerimiz olabilir:

  • Dizi - bir dizi nesne
  • Liste - nesnelerin listesi
  • Küme - nesne kümesi
  • Harita - nesnelerin sözlüğü
  • Koleksiyon - bir nesne koleksiyonu

Ve toplama alanı olan bir sınıf örneği:

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

   @magical-annotation
   public List messages;
}

Peki bir alanı değil birçok değeri saklamamızı sağlayacak bu sihirli ek açıklama nedir?

Bu açıklama @ElementCollection olarak adlandırılır . Örnek:

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

   @ElementCollection
   public List<String> messages;
}

Çok basit bir şekilde yazılmıştır, ancak önemsiz olmayan şekilde çalışır.

yardımcı tablo

Entity sınıfının birçok eleman içeren ve @ElementCollection ek açıklamasıyla işaretlenen tüm alanları , veritabanında özel bir yardımcı tabloda bulunur. Bu aslında mantıklı.

Bu tablo iki biçimde veri içerebilir:

  • Sıralı (Liste, Harita) üç sütun içerir:
    • Anahtar Sütunu (Yabancı Anahtar) – üst nesnenin kimliğine referans.
    • Dizin Sütunu - koleksiyondaki konum/dizin.
    • Öğe Sütunu - değer.
  • Sırasız (Küme) iki sütun içerir:
    • Anahtar Sütunu (Yabancı Anahtar) – üst nesnenin kimliğine referans.
    • Öğe Sütunu - değer.

Bu tablonun adını ayrıca bir ek açıklama kullanarak da belirleyebilirsiniz:

@CollectionTable(name="table_name")

Örnek:

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

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

Önemli! @CollectionTable ek açıklaması belirtilmemişse , Hazırda Bekletme, sınıf adına ve alan adına göre tablo adını kendisi oluşturur: Kullanıcı sınıfı ve alanmesajlartabloyu "User_messages" olarak adlandırın.

Koleksiyon Koleksiyonu

Ancak yardımcı tablonun oluşturulmasını Hibernate'e bırakıp kendimiz oluşturmayalım. Öncelikle iki sütunlu bir tablo oluşturmamız gerekiyor:

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

Bu tablonun kendi id sütununa sahip olmadığına dikkat edin. Yardımcı tabloların ana özelliği budur. Diğer yardımcı tablo türleri ile biraz sonra tanışacaksınız.

Şimdi bu tabloyu alanımıza eşlememiz gerekiyor.mesajlarKullanıcı sınıfında . Bu şöyle görünecek:

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

Burada iki şeye dikkat etmekte fayda var.

İlk olarak, @Column(name = "message") ek açıklamasıyla belirtilen mesaj sütunu , user tablosunda değil, user_message yardımcı tablosundadır.

İkinci olarak, @JoinColumn(name = "user_id") notunda , user tablosunun id'sine başvuran user_id sütununun adını belirttik. Bu, Hibernate'in bunları nasıl doğru bir şekilde birleştireceğini bilmesi içindir.

Toplamak

Bir listenin veya dizinin sıralı öğelerini bir yardımcı tabloda saklamak istiyorsanız, o zaman üç sütunlu bir tabloya ihtiyacınız vardır:

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

"index" sütun adını beğenmezseniz veya değiştiremezseniz, eşleştirme sırasında farklı bir ad belirtebilirsiniz. Bunu yapmak için @Index ek açıklamasını kullanmanız gerekir .

Örnek:

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

Harita koleksiyonu

Son olarak, sadece bir koleksiyonu değil, bir HashMap'i de depolamak istiyorsunuz ve bunun için bir yardımcı tabloda iki sütuna ihtiyacınız var:

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

Bir Harita için bir anahtar belirtmek üzere @MapKeyColumn ek açıklamasına ihtiyacınız vardır .

Örnek:

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

Resmi belgelerde daha fazla bilgi bulabilirsiniz .