December 13, 2013

Java Persistence API

Java Application နှင့် Database


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

အသုံးပြုနေသော Data များအား အမြဲတမ်းအသုံးပြုနိုင်သော Data အဖြစ် သိမ်းဆည်းထားရန် လိုအပ်ပါသည်။ ဤကဲ့သို့ ပြုလုပ်ခြင်းအား Persistence Data အဖြစ် ပြောင်းလည်းသည်ဟု ခေါ်ပါသည်။ အစပိုင်းတွင် အပလီကေးရှင်း၏ Data များအား File များ အဖြစ်သိမ်းဆည်းခဲ့ကြ၏။ သို့ရာတွင် File များသည် သိမ်းဆည်းရုံသာ အသုံးပြုနိုင်ပြီး၊ အသုံးပြုရလွယ်ကူသည်ဟု မဆိုနိုင်ခဲ့ပေ။

Application များတွင် အသုံးပြုသော Dataများသည် ဖွဲ့စည်းပုံကို ပိုင်ဆိုင်ကြ၏။ ထို အချက်အလက်များအား ရှာဖွေလိုသည့်အခါရှိမည်။ ရှာဖွေ၍ ပြောင်းလည်းလိုသည့်အခါလည်းရှိမည်။ အသစ် ဖြည့်စွက်လိုသည့်အခါလည်းရှိသလို ရှာဖွေ၍ ဖျက်စီးလိုသည့်အခါလည်း ရှိပါမည်။ တဖန် Data တစ်ခုနှင့် တစ်ခု၏ ပတ်သက်မှု့အား သတ်မှတ်လိုသည့် အခါလည်းရှိပါမည်။ ထိုကဲ့သို့သော အခါမျိုးတွင် File များအား အသုံးပြုနေပါက အဆိုပါအချက်များအား Application များတွင် ကိုယ်တိုင်ရေးသားရမည် ဖြစ်သည်။ File များအား အသုံးပြု၍ အစဉ်မပြေနိုင်ပါ။


ထိုအခါတွင် ထွက်ပေါ်လာသည်က Database ဖြစ်၏။ Database များသည် Standalone အနေနဲ့ အသုံးပြုနိုင်သော Database များလည်းရှိသလို၊ Server အနေနဲ့ အသုံးပြုနိုင်သော Database များလည်း ရှိပါသည်။ Database များသည် Data များအား အမျိုးအစားသတ်မှတ်ရန်သော်၎င်း၊ Data များအား အသုံးပြုရန်သော်၎င်း၊ Data များ၏ မှန်ကန်မှု့အား ထိမ်းသိမ်းပေးနိုင်ရန် အတွက် ကန့်သတ်ချက်များအား သတ်မှတ်ရာတွင်၎င်း အသုံးပြုနိုင်၏။ ထို့ကြောင့် Application များသည် Database များအား အသုံးပြုပါက အထက်တွင် ဖြစ်ပွားခဲ့သော ပြဿနာများအား ဖြေရှင်းနိုင်ပြီး၊ Program များအတွင်းတွင် Code များအား အများကြီး ရေးသားရန်လိုအပ်တော့မည် မဟုတ်။

Database သည် Data Model အပေါ်မှုတည်၍ အမျိုးအစား အမျိုးမျိုးရှိကြ၏။ Structural Database, Relational Database, Object Database, XML Database, No SQL Database အစရှိသဖြင့် များစွာရှိကြ၏။ ထိုအထဲတွင် 1970 ခုနှစ်ကတည်းက ပေါ်ပေါက်ခဲ့ပြီး၊ လက်ရှိ လူသုံးအများဆုံး Database မှာ Relational Database ဖြစ်၏။

Relational Database သည် Data များအား Table အတွင်းတွင် သိမ်းဆည်း၍၊ ၎င်းတို့၏ ပတ်သက်မှု့အား အဓိက ထား၍ တွက်ချက်သော ပုံစံကို ရယူထားပါသည်။ Data အမျိုးအစားတစ်ခုအား Table တစ်ခုအဖြစ်၎င်း၊ Data ၏ Attribute တစ်ခုအား Column အဖြစ်၎င်း အသုံးပြုပါသည်။ တဖန် Table တစ်ခုအတွင်းရှိ Data များအားလည်း Identified ပြုလုပ်နိုင်ရန် Primary Key ကိုသော်၎င်း၊ Table တစ်ခုနှင့် အခြား Table တစ်ခု၏ ပတ်သက်မှု့အား ဖော်ပြနိုင်ရန် Foreign Key များကိုသော်၎င်း၊ Table များအတွင်းရှိ အချက်အလက်များအား ရှာဖွေရလွယ်ကူစေရန် Index များကို၎င်း အသုံးပြုပါသည်။

Relational Database များတွင် Data အမျိုးအစားများအား သတ်မှတ်ရန် Data Definition Language (DDL) နှင့် Data များအား အသုံးချရန် Data Manipulation Language (DML) ဟု၍ ရှိပြီး ၎င်းတို့အား SQL ဘာသာရပ်အား အသုံးပြု၍ ရေးသားနိုင်ပါသည်။ SQL သည် ၁၉၈၆ ခုနှစ်တွင် ANSI ၏ Standard ဖြစ်လာပြီး၊ ၁၉၈၇ခုနှစ်တွင် ISO ၏ Standard ဖြစ်လာခဲ့ပါသည်။

Java Programming ဘာသာရပ်တွင် Database များနှင့် ဆက်သွယ်အသုံးပြုနိုင်ရန် ယခင်ကတည်းက Java Database Connectivity (JDBC) API အား ပံ့ပိုးပေးထားပြီး Database များနှင့် ဆက်သွယ်အသုံးပြုနိုင်ပါသည်။ Java Program တစ်ခုအတွင်းမှ JDBC အား အသုံးပြု၍ နှစ်သက်ရာ Database နှင့် ဆက်သွယ်ကာ SQL များအား အသုံးပြုကာ Data များအား Manipulate ပြုလုပ်နိုင်၏။

သို့ရာတွင်ဤကဲ့သို့အသုံးပြုခဲ့ရာတွင် Java ၏ OOP သဘာဝနှင့် Relational Data Model ၏ သဘာဝများမတူညီမှု့တို့ကြောင့် Java Developer များအတွက် Database သည် အခက်အခဲ တစ်ခု ဖြစ်ခဲ့၏။ Programming အပြင် SQL ကိုလည်း လေ့လာရဦးမည်၊ ထို့အပြင် Transaction နှင့် Locking Mechanism များကိုလည်း မသိ၍မရပေ။ အဓိက ပြဿနာမှာ Database Management System ပြောင်းလည်းသွားသည်နှင့် Data Type များ ပြောင်းလည်းသွားကြသည်ကို Java Type များနှင့် လိုက်ညီအောင် ပြုလုပ်ရသည်က ဒုက္ခတစ်မျိုး ဖြစ်ပါသည်။

JPA ၏ အခြေခံသမိုင်း


ဤကဲ့သို့သော Object များ၏ သဘာဝနှင့် Relation များ၏ သဘာဝမတူညီမှု့များအား Map လုပ်ပြီး OOP ပရိုဂရမ်များဘက်တွင် Object အတိုင်းအသုံးပြုနိုင်ရန် ဆောင်ရွက်သော အတွေးအခေါ်တစ်ခု ပေါ်ပေါက်လာခဲ့ပါသည်။ ၎င်းသည် Object Relational Mapping ဖြစ်သည်။ Java ဘာသာရပ်တွင် OR Mapping အား အခြေခံထားသော Framework များစွာရှိခဲ့၏။ ထင်ရှားခဲ့သည်မှာ Apache Foundation ၏ JDO, Seasor Framework နှင့် Hibernated တို့ ဖြစ်ကြ၏။ နောက်ပိုင်းတွင် Java EE နည်းပညာတွင်လည်း Standard အဖြစ် ORM အား အခြေခံထားသော JPA ကို ထည့်သွင်းလာခဲ့ကြ၏။ JPA သည် စတင်လာခဲ့စဉ်က Java EE ၏ Technology တစ်ခုဖြစ်ခဲ့သော်လည်း Java EE 6.0 အရောက်တွင် Java SE မှလည်း အသုံးပြုလာနိုင်ခဲ့ပါသည်။

Java Developer များသည် JPAအားအသုံးပြု၍ Relational Database အတွင်းရှိ Data များအား Object များအနေဖြင့် အသုံးပြုလာနိုင်ခဲ့ကြပါသည်။


JPA ၏ အခြေခံဖွဲ့စည်းပုံ


  • JPA အား အသုံးပြု၍ Object နှင့် Relation များ၏ သဘောသဘာဝမတူညီမှု့များအား Mapping ပြုလုပ်ပြီး၊ Java Program အတွင်းမှ Relational Database အတွင်းရှိ Data များအား Java တွင် အသုံးပြုသော Object များကဲ့သို့ပင် အသုံးပြုနိုင်၏။
  • JPA ၏ Entity Manager အား အသုံးပြု၍ Data များအား Manipulate လုပ်နိုင်စေပါသည်။ အဓိကအားဖြင့် Creation, Reference, Update နှင့် Delete အစရှိသည့် လုပ်ဆောင်ချက်များအား အကူအညီပေးပါသည်။
  • JPQL နှင့် Criteria API အား အသုံးပြု၍ Data များအား ပုံစံအမျိုးမျိုးဖြင့် Manipulate လုပ်နိုင်ရန် အကူအညီပေးပါသည်။
  • JPA ၏ Transaction နှင့် Locking Mechanism အား အသုံးပြု၍ Application Transaction များအား လွယ်ကူစွာ ထိမ်းချုပ်နိုင်ပါသည်။
  • Call Back နှင့် Listener များအား အသုံးပြု၍ Data Manipulation Event အား စောင့်ကြည့်နိုင်ပြီး၊ မိမိ၏ Business Logic များအား အလိုအလျှောက် ပြုလုပ်နိုင်ရန် စီမံထားနိုင်ပါသည်။

JPA တွင် မည်သည့် Database နှင့် မည်ကဲ့သို့ဆက်သွယ်မည်ဆိုသည့် အချက်များအား persistance.xml တွင် သတ်မှတ်ချက်များအား ရေးသားထားပြီး EntityManagerFactory မှ ၎င်းအတွင်းမှ အချက်အလက်များအား ရယူကာ Database နှင့် ဆက်သွယ်ပေးပြီး EntityManager အား Create လုပ်ပေးပါသည်။

အထက်တွင် ဖော်ပြဿကဲ့သို့ပင် JPA သည် Java EE  ပတ်ဝင်ကျင်တွင် အလုပ်လုပ်နိုင်သကဲ့သို့၊ Java SE ပတ်ဝင်းကျင်တွင်လည်း အလုပ်လုပ်နိုင်ပါသည်။ Java EE ပတ်ဝင်းကျင်တွင် အလုပ်လုပ်ပါက EntityManager အား Java EE Container မှ အလိုအလျှောက် Create လုပ်ပေးမည်ဖြစ်ပြီး၊ Java SE ပတ်ဝင်းကျင်တွင် အသုံးပြုပါက Program အတွင်းတွင် EntityManagerFactory မှတဆင့် Create လုပ်ရန်လိုအပ်ပါသည်။ နောက်ပိုင်းတွင် အသေးစိတ် ရေးသားသွားပါဦးမည်။

EntityManager သည် JPA တွင် အဓိက အလုပ်လုပ်သော Object ဖြစ်ပြီး၊ JDBC နှင့် SQL အား အသုံးပြုကာ Entity Object များအား Database ၏ Table များနှင့် တစ်သားတည်းကျနေစေရန် ဆောင်ရွက်ပေးပါသည်။ ထို့အပြင် Entity များအား Manipulate လုပ်နိုင်သော JPQL နှင့် Criteria Query တို့၏ Query Object များအားလည်း EntityManager မှတဆင့် ခေါ်ယူ အသုံးပြုနိုင်ပါသည်။


New Feature of JPA 2.1

Java EE 7 အရောက်တွင် JPA သည်လည်း Version 2.1 ဖြစ်လာပြီး အောက်ပါ Feature များအား အသစ် ဖြည့်စွက်လာ၏။


အလုပ်အတော်လေးရှုပ်နေသောကြောင့် ယခုတလော ဘလောဂ် သိပ်ပြီး မရေးဖြစ်ပေ။ ရေးလိုသည့်အကြောင်း များစွာထဲမှ Java Developer များအတွက် Database နှင့် ပတ်သက်သည့်အကြောင်းသည် မရှိမဖြစ် လိုအပ်သည်ဟု ယူဆရပါသဖြင့် ယခုတစ်ခေါက် Java Persistence API အကြောင်းကို အလွယ်တကူ မိတ်ဆက်ခဲ့ပါသည်။ နောက်ရက်များတွင်လည်း JPA အားအသုံးပြု၍ ပရိုဂရမ်ရေးသားနည်းအား ဆက်လက်ဖော်ပြသွားပါဦးမည်။

လေးစားစွာဖြင့်
မင်းလွင်

2 comments:

  1. အစ်ကိုရေ မြန်မာလိုဖတ်ခွင့်ရတဲ့အတွက်ကျေးဇူးပါ။ တစ်ခုလောက်မရှင်းလို.မေးချင်လို.ခင်ဗျ။ ကျွန်မှတ်ထားတာ မှားနေသလားလို. မေးမလို.ပါ။ JPQL (Java Persistence Query Language) ဆိုတာက Database ထဲက data ကို manipulate လုပ်တာလား ? သို.မဟုတ် mapping လုပ်ထားတဲ့ persistence object တွေကို manipulate လုပ်တာလား ခင်ဗျ။ ကျွန်တော်က persistence obj တွေအပေါ်မှာလို.ထင်လို.။ JPA ဆိုတာက specification only ပဲ ဆိုတော့ Database အမျိုးအစား (MYSQL , Oracle etc) အပေါ်မှာလိုက်ပြီး တည်ရှိမယ်မထင်လို.။ သူက JDBC အပေါ်မှာ Abstract အနေနဲ.ရှိနေပြီး ORM object တွေ (entity) တွေအပေါ်မှာ ပဲ query လုပ်တယ်ထင်လို.ပါ။ HQL (Hibernate Query Language) လိုမျိုးပဲ ထင်လို.ပါ ခင်ဗျ။ ကျေးဇူးပါ။

    ReplyDelete
  2. Your are right bro. JPQL is a part of JPA specifications. API will translate your JPQL to native SQL to specific database. If you use JDBC you need to write specific sql for each DBMS. JPA wrap those things and you can write the same way to all DBMS.

    ReplyDelete