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)
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.
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 ;
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 ;
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
Leave a Reply