EclipseLink – 13 – ElementCollection – Collection

Merhaba Arkadaslar.
Bu bolumde Collection Mapping konusuna giris yapacagiz ve @ElementCollection annotation’ini inceleyecegiz.

Bir Collection ‘a eleman olarak 3 tip obje ekleyebiliriz;

  • Entity
  • Embeddable
  • Basic Types

Onceki bolumlerde target cardinality (hedef nicelik) Many olan iliskilerde yani ManyToMany ve OneToMany iliskilerde java.util.Collection kullanmamiz gerektiginden zaten bahsetmistik ve kullanmistik. Burada geriye kalan 2 eleman tipinin bir Collection’a eklenmesi durumunu inceleyecegiz.

Embeddable ve Basic Types elemanlar iceren Collection’lar bir iliskiye karsilik gelmez , bir iliski olusturmaz. Bunlar basit olarak bir elaman koleksiyonudur , bu nedenle element collection olarak isimlendirilir.

Bir iliskiden bahsedebilmek icin 2 tane bagimsiz Entity olmasi gereklidir. Bir iliskiyi tanimlarken @ManyToOne , @ManyToMany gibi annotation’lar kullaniriz.  Bir element collection tanimlarken @ElementCollection annotation’ini kullaniriz.

Calisana ait birden fazla email bilgisi oldugunu dusunelim , bu durumda bu email bilgisini bir java.util.Set ya da java.util.List ‘te tutabiliriz. Bu durum basic type element collection’a ornek olacaktir.

Embeddable element collection icin de Vacation adinda bir Embeddable sinifimiz olsun. Calisanin (Employee) tatil gunleri bilgisi icin bu Vacation sinifini kullanalim. Calisan icin birden fazla Vacation olacagi icin bu durumda List<Vacation> gibi bir Collection yapisi kullanilabilir.

Onceki boludme Embeddable ornegi incelemistik , Single Valued bir durumda Embeddable sinifimizda yer alan instance variable’lar Entity icin olusturulan tablomuza gomulur (embed) fakat burada oldugu gibi Embeddable bir Element Collection yapisi icin bu durum soz konusu olmayacaktir bunun yerine ayri bir tablo gerekecektir.

Vacation.java

package _22.elementCollection.model;

import java.util.Date;

import javax.persistence.Embeddable;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Embeddable
public class Vacation {

	@Temporal(TemporalType.DATE)
	private Date startDate;
	private int days;

	//constructors
        //getters and setters
        //toString
}

Dikkat edelim Vacation sinifimiz @Embeddable annotation’a sahip !

Employee22.java

package _22.elementCollection.model;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee22 {

	@Id
	@GeneratedValue(strategy = GenerationType.TABLE)
	private int id;
	private String name;
	private String surname;
	private int salary;

	@ElementCollection
	private Set<String> emails;

	@ElementCollection
	// Eger Generic yapi kullanilmazsa bu durumda targetClass parametresi
	// kullanilmalidir.
	// @ElementCollection(targetClass=Vacation.class)
	private List<Vacation> vacations;

	//constructors
        //getters and setters
        //toString

}

@ElementCollection annotation da eger Generic yapi kullanilmazsa bu durumda targetClass parametresi kullanilmalidir.

EmployeeTest.java

package _22.elementCollection.test;

import java.util.Calendar;
import java.util.Date;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import _22.elementCollection.model.Employee22;
import _22.elementCollection.model.Vacation;
import _22.elementCollection.service.EmployeeService;
import _22.elementCollection.service.EmployeeServiceImpl;
import _22.elementCollection.service.VacationService;
import _22.elementCollection.service.VacationServiceImpl;

public class EmployeeTest {

	public static void main(String[] args) {
		EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("EmployeePersistenceUnit");
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		EntityTransaction entityTransaction = entityManager.getTransaction();

		EmployeeService employeeService = new EmployeeServiceImpl(entityManager);

		entityTransaction.begin();
		Employee22 employee = employeeService.createEmployee("Levent", "Erguder", 1000);
		entityTransaction.commit();

		VacationService vacationService = new VacationServiceImpl();
		Vacation vacation1 = vacationService.createVacation(new Date(), 5);

		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.MONTH, 2);

		Vacation vacation2 = vacationService.createVacation(cal.getTime(), 3);

		entityTransaction.begin();
		employee.getVacations().add(vacation1);
		employee.getVacations().add(vacation2);
		employee.getEmails().add("erguder.levent@gmail.com");
		employee.getEmails().add("injavawetrust@gmail.com");
		entityTransaction.commit();

		entityManager.close();
		entityManagerFactory.close();

	}
}

Ornegimizi inceledigimizde 1 tane Employee22 objesi , 2 tane Vacation objesi olusturuyoruz. Daha sonrasinda List<Vacation> vacations ve Set<String> emails Collection’larimiza elemanlari ekliyoruz.

Ornegimizi calistirdigimizda 3 tane tablo olusacaktir ;

  • Employee22
  • Employee22_Emails ( Entity  table name _ instance variable name)
  • Employee22_Vacations( Entity table name _ instance variable name)
  • Yine varsayilan olarak foreing key ismi Employee22_Id olarak tanimlanir;
    Entity table name_primarykey/instance variable name

element collection embeddable

Entity’ler arasinda bir iliski soz konusu oldugunda @JoinTable kullanabildigimiz gibi Element Collection’lar icin de @CollectionTable annotation’i kullanabiliriz. Boylelikle varsayilan olarak olusan tablo ismini ve foreign key bilgisini diledigimiz sekilde guncelleyebiliriz.

Onceki bolumde @AttributeOverrides ve @AttributeOverride annotation’larini inceledik. Bu annotation’lar yardimi ile Embeddable sinifimiz icin karsilik gelen kolon/column isimlerini guncelleyebiliriz.

Basic Type Element Collection icin @CollectionTable yeterli olacaktir. Boylece tablo ismini ve foreing key ismini kendimiz belirleyebiliriz.

	
	@ElementCollection
	@CollectionTable(name="EMP_EMAIL_LIST" , joinColumns=@JoinColumn(name="EMP_ID"))
	private Set emails;

         @ElementCollection
	// Eger Generic yapi kullanilmazsa bu durumda targetClass parametresi
	// kullanilmalidir.
	// @ElementCollection(targetClass=Vacation.class)
	// @JoinTable annotation'i oldugu gibi benzer sekilde @CollectionTable
	// annotation'ini kullanabiliriz.
	@CollectionTable(name = "EMP_VACATIONS", joinColumns = @JoinColumn(name = "EMP_ID"))
        //Embeddable sinifimiz icin karsilik gelen kolon/column isimlerini guncelleyebiliriz.
	@AttributeOverride(name = "days", column = @Column(name = "offDays"))
	private List<Vacation vacations;

Ornegimizi calistirdigimizda Employee22_Vacations yerine Emp_Vacations tablomuz olusur. Bu tablomuzda “days” kolonu yerine “offDays” kolonu olacaktir. joinColumns olarak da Employee22_Id yerine Emp_Id kolonu olacaktir.

Benzer sekilde Emp_Email_List tablomuz olusacaktir. Foreign key kolonu Emp_Id olacaktir.

element collection collectiontable

Kaynak kodlar : Injavawetrust.jpa_v10

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *