17 Ekim 2018 Çarşamba

JPA @ElementCollection Anotasyonu

Giriş
list,set, map gibi dizileri farklı bir tabloda saklamayı sağlar. JPA 2 ile geliyor. Bu anotasyon sadece primitive tipler veya @Embeddable olarak işaretli sınıflar ile kullanılabilir.

@Entity olarak işaretli sınıflar için kullanmayın!. Bu sınıflar için yine @OneToMany kullanmak gerekir.

Bu anotasyon bezen @CollectionTable ile birliktedir. Eğer liste olarak kullanıyorsak sırayı korumak için @OrderColumn ile kullanılabilir.

@ElementCollection ile join table yaratılmaz çünkü Element tarafının @Basic veya @Embedded olduğu yani id alanına sahip olmadığı kabul edilir. Bu anlamnda unidirectional OneToMany gibidir. Child nesnelerin hayatı Parent nesneye bağlıdır. Child nesnenin id alanı olmadığı için tek bir nesneyi silme,güncelleme işlemi mümkün değil. Bu yüzden maliyetli olabilir.

Şöyle yaparız.
@ElementCollection
private Collection<String> strings;
fetch Alanı
Şöyle yaparız.
@ElementCollection(fetch = FetchType.EAGER)
private Map<String, Object> params;
targetClass Alanı
Eğer generic olmayan veriyapısı kullanıyorsak taşıdğı tipi belirtmek için kullanılır. Şöyle yaparız.
@ElementCollection(targetClass = Casting.class)
@OneToMany
private List castings;
Diğer
Örnek
Primary key dönmek için şöyle yaparız.
@ElementCollection
@CollectionTable(name="user_page", joinColumns=@JoinColumn(name="id_user"))
@Column(name="id_page")
public Set<Long> pageIds;
Örnek
List ile kullanmak için şöyle yaparız.
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "variant_option_vals",
        joinColumns = @JoinColumn(name = "variantOption_id")
@OrderColumn(name="sequence")
)
private List<String> optionValues;
Örnek
Sanırım 3 katlı içiçe listelerde kullanılamıyor.
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "id"))
@OrderBy("id")
private List<List<List<Double>>> coordinates

Hiç yorum yok:

Yorum Gönder