EclipseLink – 14 – ElementCollection – Map – 01

Merhaba Arkadaslar
Onceki bolumde Element Collection kavramini inceledik ve java.util.Set ve java.util.List tipinde Basic Type ve Embeddable elemanlar iceren ornekler yaptik.
IS-A kavrami olarak java.util.Map arabirimi java.util.Collection degildir. Yani Map arabirimi Collection arabirimini kalitmaz. Bununla birlikte “Collection” kavramindan bahsedildiginde aklimiza Map de gelecektir.

Keys and Values

Map in key’leri

  • Basic types
  • Embeddable types
  • Entity types olabilir.

Key type Basic ya da Embeddable oldugunda Key’ler ayri bir tabloda saklanir/store.
Bununla birlikte Key type Entity ise bu durumda sadece foreign key bilgisi tabloda tutulur. Entity’in kendisi zaten kendi tablosunda saklanir/store.

Ne tur bir annotation ve mapping kullanilacagi konusunda Value kismi onemlidir. Eger Value type Entity ise bu durumda Map icin @OneToMany ya da @ManyToOne annotation kullanilmalidir.
Embeddable Type ya da Basic Type icin ise  @ElementCollection annotation kullanilmalidir.

Burada Key ‘in Basic Type oldugu durumlari inceleyecegiz.

Keying By Basic Type

Employee sinifimizda Key ve Value tipi java.lang.String olan bir Map tanimlayalim , bu Map icin @ElementCollection annotation’i ekleyelim.

Employee23.java

package _23.elementCollectionStringMap.model;

import java.util.Map;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee23 {

	@Id
	@GeneratedValue(strategy = GenerationType.TABLE)
	private int id;
	private String name;
	private String surname;
	private int salary;
	
	@ElementCollection
	private Map<String,String> phoneNumbers;

	//constructors
        //getters and setters
        //toString

}

EmployeeTest.java

package _23.elementCollectionStringMap.test;

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

import _23.elementCollectionStringMap.model.Employee23;
import _23.elementCollectionStringMap.service.EmployeeService;
import _23.elementCollectionStringMap.service.EmployeeServiceImpl;


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();
		Employee23 employee = employeeService.createEmployee("Levent", "Erguder", 1000);
		entityTransaction.commit();

		entityTransaction.begin();
		employee.getPhoneNumbers().put("Home", "0216");
		employee.getPhoneNumbers().put("Work", "0212");
		employee.getPhoneNumbers().put("Mobile", "055");
		entityTransaction.commit();

		System.out.println("Persisted : " + employee);
		
		
		entityManager.close();
		entityManagerFactory.close();

	}
}

Employee23 objesi olusturduktan sonra  Map<String,String> phoneNumbers ‘a 3 tane eleman ekliyoruz (put).

Ornegimizi calistirdigimizda 2 tane tablo olusacaktir ;

  • Employee23
  • Employee23_PhoneNumbers

Employee23_PhoneNumbers tablosunda 3 tane kolon olusacaktir.

  • Employee23_Id (tablename_primarykey name)
  • PhoneNumbers (instance variable name)
  • PhoneNumbers_Key (instance variablename_KEY)

element collection string map

Varsayilan bu isimleri override etmek icin yine onceki bolumde oldugu gibi @CollectionTable annotation kullanabiliriz. @CollectionTable annotation ile tablo ismimizi override edebiliriz.

Map Key kolonunu override etmek icin @MapKeyColumn annotation kullanabiliriz.
Map Value kolonunu ovrride etmek icin @Column annotation kullanabiliriz. Daha once bu annotation’i incelemistik. PhoneNumbers kolonu Employee23 sinifimizdaki phoneNumbers instance variable adindan gelir , dolayisiyla @Column annotation’i kullanarak bu ismi override edebiliriz.

	@ElementCollection
	@CollectionTable(name = "EMP_PHN_MAP", joinColumns = @JoinColumn(name = "EMP_ID"))
	@MapKeyColumn(name = "PHONE_TPYE")
	@Column(name = "PHONE_NUM")
	private Map<String, String> phoneNumbers;

Ornegimizi calistirdigimizda tablomuzun adi EMP_PHN_MAP , Employee23_Id yerine Emp_Id , PhoneNumbers yerine Phone_Num , PhoneNumbers_Key yerine Phone_Type olarak override edildigini gorebiliriz.

element collection string map collection table

Enumerated type

Key olarak String yerine Enumerated type da kullanabiliriz.

PhoneType.java

package _24.elementCollectionEnumMap.model;

public enum PhoneType {
	HOME, MOBILE, WORK
}

Employee24.java

package _24.elementCollectionEnumMap.model;

import java.util.LinkedHashMap;
import java.util.Map;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee24 {

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

	@ElementCollection
	private Map<PhoneType, String> phoneNumbers;

	//constructors
	//setters and getters
	//toString

}

Employee24 sinifimizda @ElementCollection annotation kullaniyoruz. Dikkat edecek olursak Key olarak java.lang.String tipi yerine PhoneType yani bir Enumerated type kullaniyoruz.

EmployeeTest.java

package _24.elementCollectionEnumMap.test;

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

import _24.elementCollectionEnumMap.model.Employee24;
import _24.elementCollectionEnumMap.model.PhoneType;
import _24.elementCollectionEnumMap.service.EmployeeService;
import _24.elementCollectionEnumMap.service.EmployeeServiceImpl;

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();
		Employee24 employee = employeeService.createEmployee("Levent", "Erguder", 1000);
		entityTransaction.commit();

		entityTransaction.begin();
		employee.getPhoneNumbers().put(PhoneType.HOME, "0216");
		employee.getPhoneNumbers().put(PhoneType.WORK, "0212");
		employee.getPhoneNumbers().put(PhoneType.MOBILE, "0555");
		entityTransaction.commit();
                System.out.println("Persisted : " + employee);

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

	}
}

Ornegimizi calistirdigimizda varsayilan olarak tablo ismi ve kolon isimlerini inceleyelim ;

element collection enum map

Enumerated type icin varsayilan olarak ORDINAL kullanilmaktadir. Bu nedenle 0 1 2 seklinde olmaktadir. Bunun yerine STRING kullanabiliriz. Daha once @Enumerated annotation i kullandik , benzer sekilde @MapKeyEnumerated annotation ile EnumType belirtebiliriz.
Yine bir onceki ornegimizde kullandigimiz @MapKeyColumn , @Column annotation ile kolon isimlerini , @CollectionTable ile de tablo ismini override edebiliriz.

	@ElementCollection
	@CollectionTable(name = "EMP_PHONE_MAP")
	@MapKeyEnumerated(EnumType.STRING)
	@MapKeyColumn(name = "PHN_TYPE")
	@Column(name = "PHN_NUM")
	private Map<PhoneType, String> phoneNumbers;

Ornegimizi tekrar calistirdigimizda ;

element collection enum collection table1

 

Kaynak kodlar :Injavawetrust.jpa

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 *