January 16, 2014

ORM : Collection နှင့် Map

Java ပရိုဂရမ်မင်းဘာသာရပ်တွင် Collections များသည် လွန်စွာမှ အသုံးဝင်လှပေသည်။ Data များအား အစီအစဉ်လိုက် အသုံးပြုလိုပါက ယခင်က Array နှင့် Vector များအား အသုံးပြုခဲ့ကြသော်လည်း၊ Collections Framework ပေါ်လာပြီးနောက် List အား အသုံးပြုများလာခဲ့ပါသည်။

JPA 2.0 မှစ၍ @ElementCollection နှင့် @CollectionTable Annotation များအား အသုံးပြုပါက အခြားသော Entity Class များအား ရေးသားစရာမလိုပဲ Collections များအား အသုံးပြုလာနိုင်ပါသည်။

JPA တွင်လည်း Collections များအား အသုံးပြုနိုင်ပြီး၊ လက်ရှိ JPA 2.1 တွင် အသုံးပြုနိုင်သော Collection များမှာ အောက်ပါအတိုင်း ဖြစ်ကြ၏။

  • java.util.Collection
  • java.util.Set
  • java.util.List
  • java.uitl.Map

Collections of Basic Types


နောက်အခန်းများတွင် လေ့လာသွားမည့် Entity များအကြားရှိ ပတ်သက်မှု့အား Mapping လုပ်သည့် အကြောင်းအရာများ၌ Entity တစ်ခုနှင့် Entity အများ၏ ပတ်သက်မှု့အား Mapping လုပ်ရသည့်အခါ များလည်းပါလာ ပါလိမ့်မည်။ အဆိုပါ ပတ်သက်မှု့အား ဖော်ပြရာတွင် Entity များအား သက်ဆိုင်ရာ Table နှင့် Mapping လုပ်ပြီး၊ ပတ်သက်မှု့အား Primary Key နှင့် Foreign Key များအား တည်ဆောက်၍ Mapping လုပ်ပါသည်။

အထက်တွင်ဖော်ပြပြီးသကဲ့သို့ပင် Entity တစ်ခုသည် Identity တစ်ခုနှင့် အခြားသော Attribute များအား ပိုင်ဆိုင်ပါသည်။ အကဲ၍ Attribute အနေနှင့် String ဒါမှမဟုတ် int List အား အသုံးပြုလိုပါက မည်သို့ပြုလုပ်မည်နည်း။

နမှုနာအနေနှင့် Tag များစွာ ရေးသားနိုင်သော Blog Entity တစ်ခုအား ရေးသားကြည့်ပါဦးမည်။


အထက်ဖော်ပြပါ အတိုင်း tag Attribute အား List အနေနှင့် အသုံးပြုထားပါသောကြောင့် @ElementCollection နှင့် @CollectionTable Annotation အား ဖြည့်စွက်ရေးသားထားပါသည်။ အဆိုပါ Entity အား အသုံးပြု၍ Schema အား Generate လုပ်ကြည့်သောအခါ ဘယ်ဘက်တွင် ဖော်ပြထားသည့် အတိုင်း Table များအား တည်ဆောက်ပေးပါသည်။

CollectionTable တွင် အထွေအထူး တန်ဖိုးများအား ရေးသားထားခြင်း မရှိသောကြောင့် Default အတိုင်း Table ၏ အမည်အား BLOG_TAG ဟု တည်ဆောက်သွားပါသည်။ တဖန် Blog Entity ၏ ID အား Foreign Key အနေနှင့် BLOG_ID ဟု BLOG_TAG Table အတွင်း တည်ဆောက်သွားသည်ကို တွေ့ရပါသည်။

ထိုကဲ့သို့ CollectionTable အား အသုံးပြုပါက Entity Class တစ်ခုအား တည်ဆောက်စရာမလိုအပ်ပဲ Collection များအား Entity အတွင်းမှ အလွယ်တကူ အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။ JPA တွင် List အပြင် Set ကိုလည်း Collection အနေနှင့် အသုံးပြုနိုင်ပါသေးသည်။

အထက်နမှုနာတွင် CollectionTable အား Default  အတိုင်း အသုံးပြုထားသော်လည်း၊ အကဲ၍ တန်ဖိုးများအား Customize လုပ်၍ အသုံးပြုလိုပါက၊ ၎င်း၏ Attribute တန်ဖိုးများအား ပြောင်းလဲ၍ အသုံးပြုနိုင်ပါသည်။ အသုံးပြုနိုင်သော Attribute များမှာ အောက်ပါအတိုင်း ဖြစ်ကြပါသည်။

  • catalog
  • foreignKey
  • indexes
  • joinColumns
  • name
  • schema
  • uniqueConstrients


Map of Basic Type

Collections များကဲ့သို့ပင် Map သည်လဲ Java ဘာသာရပ်တွင် အသုံးဝင်သော Data Structure တစ်မျိုးပင် ဖြစ်၏။ JPA 1.0 တွင် Map ၏ key များအား Basic Data Type နှင့် Value များအား Entities များသာ အသုံးပြုနိုင်ခဲ့သော်လည်း၊ ယခုအခါတွင် တွဲဆက်ပုံအမျိုးမျိုးကို အသုံးပြုလာနိုင်ခဲ့၏။ key နေရာတွင် Basic Data Type အပြင် Embeddable နှင့် Entity ကိုပါအသုံးပြုလာနိုင်ပြီး၊ Value နေရာတွင်လည်း အမျိုးမျိုး အသုံးပြုလာနိုင်၏။ ယခင်ကထက်စာလျှင် ပိုမိုကျယ်ပြန့်စွာ အသုံးပြုလာနိုင်သည်ဟု ဆိုရပါမည်။

Map အား Entity ၏ Basic Datatype အနေနှင့် အသုံးပြုရာတွင်၊ Collection အား အသုံးပြုသကဲ့သို့ပင် @CollectionTable နှင့် @ElementCollection အား ဆက်လက်အသုံးပြုရန် လိုအပ်ပြီး၊ ၎င်းအပြင် @MapKeyColumn အားလည်း ရေးသားရန် လိုအပ်ပါသည်။

Entity ၏ ID Column သည် Collection Table အတွင်း ForeignKey အဖြစ် တည်ဆောက်သွားမည် ဖြစ်ပြီး၊ Map ၏ Key နှင့် Value အားလည်း အသီးသီး Column အဖြစ် တည်ဆောက်သွားမည် ဖြစ်သည်။ MapKeyColumn ၏ အမည်နှင့် တည်ဆောက်ထားသော Column အတွင်း Map Key အား သိမ်းဆည်းပြီး၊ Attribute Name ဖြင့် တည်ဆောက်ထားသော Column အတွင်း Map Value အား သိမ်းဆည်းပေးနိုင်မည် ဖြစ်ပါသည်။


အကယ်၍ Default တန်ဖိုးအား Customize လုပ်လိုသည့်အခါမျိုးတွင် MapKeyColumn ၏ Attribute တန်ဖိုးများအား ပြုပြင်၍ ရေးသားနိုင်ပါသည်။ MapKeyColumn တွင် သတ်မှတ်ရေးသားနိုင်သော Attribute များမှာ အောက်ပါအတိုင်း ဖြစ်ပါသည်။
  • columnDefinition
  • insertable
  • length
  • name
  • nullable
  • precision
  • scale
  • table
  • unique
  • updatable

ဤနည်းအားဖြင့် Collections နှင့် Map များအား အသုံးပြုခြင်းအားဖြင့် Table တစ်ခုတည်းနှင့် ပတ်သက်သော Table များအား Entity အနေနှင့် တကူးတက ရေးသားစရာမလိုပဲ Business Logic တွင် အသုံးပြုလိုသည့် Entity များကိုသာ ရေးသား အသုံးပြုနိုင်မည် ဖြစ်သောကြောင့် JPQL အား ရေးသားရာတွင် ရိုးရှင်းစွာ ရေးသားနိုင်မည် ဖြစ်သည်။

Database အား ကျင်လည်စွာအသုံးပြုလာသော Developer များသည် JPA အား ရေးသားပါက Table ရှိသလောက် Entity အား ရေးသားမိမည် ဖြစ်သည်။ သို့ရာတွင် ဤကဲ့သို့ JPA ၏ ထူးခြားချက်များအား အသုံးပြု၍ ရေးသားမည်ဆိုပါက မိမိရေးသားသော Code များသည် ပိုမိုရိုးရှင်း၍ လွယ်ကူနိုင်မည် ဖြစ်ပေသည်။ 

ဆက်ပါဦးမည်
မင်းလွင်

1 comment: