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 .
GO TO FULL VERSION