January 12, 2014

ORM : Columns Mapping

JPA တွင် Entity Class နှင့် Relational Database အတွင်းရှိ Table အား Mapping လုပ်ရာတွင် သာမန်အားဖြင့် @Entity Annotation နှင့် @Id သာ လိုအပ်၏။ အခြားသော Mapping များအား ပြုလုပ်ထားခြင်းမရှိပါက Default အတိုင်း Mapping လုပ်သွားမည် ဖြစ်သည်။ Entity ၏ Member များ၏ အမည်နှင့် တူပြီး၊ သင့်လျော်သော ပုံစံရှိသည့် Column များနှင့် Mapping လုပ်သွားမည် ဖြစ်သည်။

သို့ရာတွင် အမည်မတူသည့် Column နှင့် Mapping လုပ်လိုသည့်အခါတွင်၎င်း၊ Column ၏ Constraints များအား သတ်မှတ်လိုသည့်အခါတွင်၎င်း၊ java.util.Date , java.util.Calender နှင့် Enum များအား အသုံးပြုလိုသည့် အခါမျိုးတွင် အထွေအထူး Mapping လုပ်ရန် လိုအပ်၏။

JPA 2.1 တွင် အသုံးပြုနိုင်သော Mapping များမှာ အောက်ပါအတိုင်း ဖြစ်ပါသည်။



@Basic


Basic Annotation သည် Database Column နှင့် Mapping လုပ်ရာတွင် အရိုးရှင်းဆုံး ပုံစံဖြစ်ပြီး၊ ၎င်းအား အသုံးပြုထားခြင်းအားဖြင့် Persistence ၏ အခြေခံ သတ်မှတ်ချက်များအား Override လုပ်နိုင်ပါသည်။

@Basic Annotation တွင် အသုံးပြုနိုင်သော Arguments များမှာ fetch နှင့် optional တို့ ဖြစ်ကြ၏။ fetch သည် Database  အတွင်းမှ Data များအား Fetch လုပ်သည့် နည်းအား သတ်မှတ်ပေးပြီး၊ Default တန်ဖိုးသည် EAGER ဖြစ်ပါသည်။ EAGER အား အသုံးပြုပါက Database အတွင်းမှ Data များအား ချက်ချင်းခေါ်ထုတ်လာမည်ဖြစ်ပြီး၊ LAZY အား အသုံးပြုထားပါက Entity အတွင်းမှ Member အား ခေါ်ယူသည့်အခါတွင် အချက်အလက်များအား ခေါ်ယူမည် ဖြစ်သည်။

အကယ်၍ Blog တစ်ခု၏ Table တွင် ဓာတ်ပုံ၊ Blog စာသားများ အစရှိသည့် ပမာဏကြီးမားသည့် Column များအား အသုံးပြုတတ်ပါသည်။ Blog List အား ဖော်ပြသည့် အခါမျိုးတွင် လေးလံသော Data များအား အသုံးမပြုပဲ ခေါ်ထားချင်မည် မဟုတ်ပါ။ ထိုအခါမျိုးတွင် @Basic Annotation အား အသုံးပြု၍ fetch တန်ဖိုးအား LAZY ဟု သတ်မှတ်အသုံးပြုနိုင်ပါသည်။


အထက်ဖော်ပြပါပုံထဲတွင် Student Entity Class အတွင်း၌ photo member အား byte [] အနေနှင့် အသုံးပြုထားပြီး၊ ၎င်းအား Database အတွင်းတွင် BLOB Type အဖြစ် အသုံးပြုလိုသောကြောင့် @Lob အား ရေးသားထား၏။ ဓာတ်ပုံ ဖြစ်၍ Size အလွန်ကြီးမည် ဖြစ်သောကြောင့် Fetch Type အား LAZY လုပ်ရန် လိုအပ်သည်။ ထို့ကြောင့် @Basic Annotation အား အသုံးပြုကာ fetch ၏တန်ဖိုးတွင် FetchType.LAZY ဟု ရေးသားထားသည်။ ဤသို့ရေးသားခြင်းအားဖြင့် Default ဖြစ်သော FetchType.EAGAR အား FetchType.LAZY ဖြင့် override လုပ်ပြီး အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။


@Column


Database Column တစ်ခုတွင် သတ်မှတ်နိုင်သော လက္ခဏာများအား Entity မှနေ၍ သတ်မှတ်လိုသည့်အခါမျိုးတွင် @Column Annotation အား အသုံးပြုနိုင်ပါသည်။ Column တစ်ခု၏ အမည်၊ အရှည်၊ Null လက်ခံခြင်းရှိမရှိ၊ Unique ဖြစ်မဖြစ်၊ Update, Insert လုပ်၍ ရမရ အစရှိသည့် အချက်များအား သတ်မှတ်လိုသည့် အခါမျိုးတွင် အသုံးပြုနိုင်ပါသည်။ ၎င်း၏ Default တန်ဖိုးများမှာ အောက်ပါအတိုင်း ဖြစ်ကြပါသည်။
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Column {
    String name() default "";
    boolean unique() default false;
    boolean nullable() default true;
    boolean insertable() default true;
    boolean updatable() default true;
    String columnDefinition() default "";
    String table() default "";
    int length() default 255;
    int precision() default 0; // decimal precision
    int scale() default 0; // decimal scale
}

အထက် ဖော်ပြပါ Column ၏ Definition များ၏ Default တန်ဖိုးများအား ပြောင်း၍ အသုံးပြုလိုပါက သက်ဆိုင်ရာ Attribute များ၏ တန်ဖိုးအား အသုံးပြုလိုသည့် တန်ဖိုးဖြင့် ဖြည့်စွက် ရေးသားရန် လိုအပ်ပါသည်။

နမှုနာအနေနှင့် Student Entity Class ၏ phone အား အမည်အား PHONE_NUM အဖြစ်၎င်း၊ nullable အား false အဖြစ်၎င်း၊ unique အား true အဖြစ်၎င်း သတ်မှတ်၍ Run ကြည့်ပါမည်။


အထက်ပါအတိုင်း Table အား တည်ဆောက်ပေးသည်ကို တွေ့ရပါသည်။ ဤနည်းအားဖြင့် Table Column အား Default တန်ဖိုးအား ပြောင်းလဲအသုံးပြုလိုသည့်အခါတွင် @Column Annotation အား အသုံးပြုနိုင်ပါသည်။


@Temporal


Entity Class ၏ Member အား java.util.Date ဒါမှမဟုတ် java.util.Calender အား အသုံးပြုထားသည့် အခါမျိုးတွင် @Temporal Annotation အား အသုံးပြုရန် လိုအပ်ပါသည်။ သတ်မှတ်အသုံးပြုနိုင်သော တန်ဖိုးများမှာ DATE, TIME နှင့် TIMESTAMP တို့ ဖြစ်ကြ၏။



@Transient


Business Application များရေးသားရာတွင် Application တွင် အသုံးလိုသော်လည်း၊ Database အတွင်း သိမ်းဆည်းမထားချင်သော အချက်အလက်များရှိကြပါလိမ့်မည်။ ဥပမာအားဖြင့် View အပေါ်တွင် Check Box အား ထား၍ အသုံးပြုလိုသော်လည်း၊ Database အတွင်း သိမ်းထားရန် မလိုသည့်အခါမျိုး ရှိမည်။ ထို အခါမျိုးတွင် @Transient Annotation အား အသုံးပြုနိုင်ပါသည်။

Entity Class ၏ Member တွင် @Transient Annotation အား ရေးသားထားပါက Database Column နှင့် Mapping လုပ်မည်မဟုတ်ပါ။ သို့ရာတွင် Application ၌ အသုံးပြုနိုင်မည် ဖြစ်သည်။


အထက်ပါနမှုနာထဲတွင် check မှာ @Transient Annotation အား အသုံးပြုထားသောကြောင့် Table အတွင်းတွင် ပါဝင်ခြင်းမရှိပဲ အသုံးပြုနိုင်ခြင်း ဖြစ်ပါသည်။


@Enumerated


Java SE 5 အရောက်တွင် Java ပရိုဂရမ်မင်းဘာသာရပ်သည် အကြီးအကျယ် ပြောင်းလဲခဲ့၏။ Type Safe ဖြစ်ရန်အတွက် Generics သဘောတရားအား စတင်အသုံးပြုခဲ့သလို၊ Metadata များအား ဖော်ပြနိုင်သော Annotation အားလည်း အသုံးပြုလာခဲ့နိုင်၏။ Java SE 5 နှင့် အတူ enum Type လည်း ပါဝင်လာခဲ့ပါသည်။ ယခင်က မပြောင်းလဲသောတန်ဖိုးများအတွက် static variable များအား အသုံးပြုခဲ့သော်လည်း၊ ပြောင်းလည်းမည် ဆိုပါက ပရိုဂရမ်တစ်လျှောက်တွင် ပြောင်းလဲသွားနိုင်သည်။ သို့ရာတွင် enum type အား အသုံးပြုထားပါက သတ်မှတ်ထားသော တန်ဖိုးမှလွဲပြီး အသုံးပြုနိုင်မည် မဟုတ်ပေ။ Entity Class များတွင် enum type များအား အသုံးပြုရန်အတွက် @Enumerated Annotation အား အသုံးပြုနိုင်ပါသည်။

@Enumerated အား အသုံးပြုရာတွင် ORIDINAL နှင့် STRING အား အသုံးပြုနိုင်ပြီး၊ Default တန်ဖိုးမှာ ORIDINAL ဖြစ်ပါသည်။ ORIDINAL အားအသုံးပြုထားပါက Table အတွင်းတွင် int ပုံစံဖြင့် Column အား တည်ဆောက်သွားမည် ဖြစ်ပြီး၊ STRING အား အသုံးပြုပါက VARCHAR ဖြင့် တည်ဆောက်သွားပါလိမ့်မည်။


အထက်ပါအတိုင်း enum type အား အသုံးပြု၍ STRING အား ရေးသား အသုံးပြုပါက Table အတွင်းတွင် VARCHAR ဖြင့် Column အား တည်ဆောက်အသုံးပြုသွားနိုင်ပါလိမ့်မည်။ ဤကဲ့သို့ enum အား အသုံးပြုခြင်းအားဖြင့် enum ၏ value များမှလွဲ၍ အသုံးပြုနိုင်တော့မည် မဟုတ်ပေ။

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

No comments:

Post a Comment