August 30, 2016

Persistence Unit Configuration

Persistence Unit ဆိုတာက JPA ကို သုံးရင် မရှိမဖြစ်လိုအပ်တဲ့ persistence.xml file ထဲမှာ ရေးသားထားရမည့် Configuration ဖြစ်ပါတယ်။ ဒါ့ကြောင့် persistence.xml ဆိုတာ ဘာလုပ်ဖို့ရှိတာလဲလို့ပြောရင် Persistence Unit ကို Configure လုပ်ဖို့ရှိတာလို့တောင် ပြောလို့ရပါမယ်။

Persistence Unit ထဲမှာ ဘာတွေကို Configure လုပ်နိုင်မလဲ။ ပြီးတော့ ဘယ်အရာတွေကို မဖြစ်မနေ ရေးရမယ်၊ ပြီးရင် ဘယ်လို Option တွေကို ရေးနိုင်တယ်၊ ပြီးတော့ ဘယ်လို Customize လုပ်နိုင်မယ်ဆိုတာကို ဒီတစ်ခေါက်ရေးပါမယ်။

JPA ဆိုတာ Java EE ရဲ့ Persistence Layer အတွက် Standard API တစ်ခုဖြစ်တယ်။ Java EE Community ကနေ JPA ဟာ ဘယ်လိုရှိသင့်တယ်ဆိုတာကိုပဲ Define လုပ်ထားပါတယ်။ တကယ် အလုပ်လုပ်နေတာကတော့ နောက်ကွယ်မှာရှိတဲ့ Provider တွေပါ။ အထင်ကရရှိတာကတော့ Hibernate တို့ Eclipse Link တို့ပါပဲ။

ဒီနေရာမှာ JPA ရဲ့ Standard Configuration တွေ အပြင် Hibernate မှာ သုံးရင် အစဥ်ပြေမည့် Platform Specific ဖြစ်တဲ့ Configuration တွေကိုလဲ ဖေါ်ပြသွားပါမယ်။


Datasource Configuration


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

Configurations
Values
javax.persistence.transactionType
JTA, RESOURCE_LOCAL
javax.persistence.jtaDataSource
JTA Datasource name
javax.persistence.nonJtaDataSource
Non JTA Datasource name
javax.persistence.jdbc.driver
JDBC Driver class name for Java SE
javax.persistence.jdbc.url
JDBC URL for Java SE
javax.persistence.jdbc.user
Database user name for Java SE
javax.persistence.jdbc.password
Database password for user

အရင်ဆုံးရွေးချယ်ရမှာကတော့ Transaction Type ဖြစ်တယ်။ မိမိရေးသားလိုသည်က Java EE ပတ်ဝန်းကျင်မှာလား Java SE ပတ်ဝန်းကျင်မှာလားဆိုတာကို ဆုံးဖြတ်ပြီးမှ ရွေးချယ်ရပါမယ်။ Java EE ပတ်ဝန်းကျင်မှာ ဆိုရင် JTA ကို ရွေးပေးပြီး၊ Java SE ပတ်ဝန်းကျင် အတွက်ဆိုရင် RESOURCE_LOCAL မှာ ရွေးချယ်ရပါမယ်။

Java EE ကို Support လုပ်တဲ့ Glassfish server တို့ Wildly Server တို့ဟာ JTA Transaction ကို Support လုပ်တဲ့ DataSource တွေကို Server ကနေ Support လုပ်နေတဲ့ အတွက် JTA ကို ရွေးချယ်ရပါမယ်။ ပြီးရင် ဆက်ပြီး ရွေးချယ်ရမှာကတော့ DataSource Name ပဲ။


Java EE ပတ်ဝန်းကျင်


Wildlflyလို Glassfish လို Java EE Server တွေ ဆိုရင် jtaDataSource ရဲ့ တန်ဖိုးကို JNDI Name ကို သုံးပြီး သတ်မှတ်ပေးရမယ်။ Server ပေါ်မှာ Configure လုပ်ထားတဲ့ JTA Datasource ရဲ့ JNDI Name ကို ဆိုလိုတာပါ။

Tomcat လို JTA ကို Support မလုပ်တဲ့ Datasource တွေ ဆိုရင်တော့ Transaction Type ကို Resource Local ကို ပေးပြီး nonJtaDataSource ရဲ့ နေရာမှာ DataSource Name ကို ရေးပေးရပါမယ်။

အဲ့ဒီတော့ Web ပတ်ဝန်းကျင်မှာ ဆိုရင် JTA ကို ရွေးပြီး DataSource Name ကိုတော့ jtaDataSource လား nonJtaDataSource လား ဆိုတာကို ရွေးပေးရမှာပါ။


အထက်ပါ နမူနာကတော့ Wildfly ပေါ်မှာ ရေးသားထားတဲ့ Configuration ဖြစ်ပါတယ်။ Transaction Type ကို Default ဖြစ်တဲ့ JTA နဲ့ ထားပြီး JTA data source မှာတော့ Server ပေါ်မှာ Configure လုပ်ထားတဲ့ JNDI Name ကို ပေးထားပါတယ်။ Eclipse IDE ရဲ့ JPA Editor ကို သုံးရင် အထက်ပါ အတိုင်း GUI နဲ့ Configure လုပ်နိုင်မှာ ဖြစ်တယ်။

XML နဲ့ တိုက်ရိုက် ရေးသားမယ်ဆိုလဲ​ အောက်ပါ အတိုင်း ရေးသားနိုင်ပါမယ်။
Datasource ကို ဘယ်လို Configure လုပ်မယ်ဆိုတာကတော့ နောက်ပိုင်းမှာ ဖေါ်ပြသွားပါမယ်။



Java SE ပတ်ဝန်းကျင်


Desktop Application လို Java SE ပတ်ဝန်းကျင်မှာ ဆိုရင်တော့ Application Server တွေရဲ့ Support တွေကို သုံးလို့ရမှာ မဟုတ်ပါဘူး။ အဲ့ဒီအတွက် Transaction Type ကို RESOURCE_LOCAL ကို ရွေးချယ်ပေးရမှာပါ။ RESOURCE_LOCAL ကို သုံးမယ်ဆိုရင်တော့ Database ကို ချိတ်ဆက်ဖို့လိုအပ်တဲ့ Information တွေကို ရေးသားပေးထားရမှာ ဖြစ်ပါတယ်။

အဓိကကတော့ အသုံးပြုမည့် Driver Class Name, URL, User Name, Password တို့ဖြစ်ကြပါတယ်။


အထက်တွင် ဖေါ်ပြထားသည့်အတိုင်း Transaction Type ကို Resource Local ကို ရွေးချယ်ပြီး JDBC Connection Properties တွေမဟာ Driver, URL, User နဲ့ Password တို့ကို လိုအပ်သလို ဖြည့်စွက်ပေးရပါမယ်။

XML မှာ တိုက်ရိုက်ရေးသားမယ်ဆိုလဲ ဖြစ်ပါတယ်။ Driver ရဲ့တန်ဖိုးကို HSQL DB ကို အသုံးပြုမှာ ဖြစ်တဲ့အတွက် org.hsqldb.jdbc.JDBCDriverလို့ ရေးပြီး၊ Memory ပေါ်မှာရှိတဲ့ Standalone DB ကို သုံးချင်တဲ့အတွက် URL ကိုတော့ jdbcးhsqldbးmemးjpa1 လို့ရေးထားပါတယ်။ HSQL DB ရဲ့ Default User Name ဟာ sa ဖြစ်တဲ့အတွက် နမူနာထဲမှာတော့ USER ကို sa လို့ပဲသတ်မှတ်ထားပြီး Password နဲ့ပတ်သက်ပြီး မလိုအပ်သောကြောင့် ရေးမထားလဲ​ရပါတယ်။

ဒါကလဲ မိမိလိုသလို သတ်မှတ်နိုင်ပါတယ်။ MySQL ကို သုံးမယ်ဆိုရင်လဲ​ MySQL ရဲ့တန်ဖိုး Oracle DB ကို သုံးမယ်ဆိုရင်လဲ သတ်မှတ်ထားတဲ့အတိုင်း ရေးသားနိုင်ပါတယ်။


Schema Generation


JPA Version 2.1 ကနေစပြီး Schema Generation Function ကို အသုံးပြုလာနိုင်ပါတယ်။ ရေးသားထားတဲ့ Entity Class တွေရဲ့ Metadata တွေကနေ Relational Database ရဲ့ Table တွေကို တည်ဆောက်ပေးနိုင်လာပါတယ်။ အောက်ပါ Configuration တွေကတော့ လိုအပ်မှ သုံးဖို့လိုတဲ့ Optional Configuration တွေ ဖြစ်ကြပါတယ်၊

Configurations
Values
database.action
none, create, drop-and-create, drop
script.action
none, create, drop-and-create, drop
create-source
metadata, script, metadata-then-script, script-then-metadata
drop-source
metadata, script, metadata-then-script, script-then-metadata
create-database-schemas
true, false
scripts.create-target
output of create ddl (sql) file name
scripts.drop-target
output of drop ddl (sql) file name
scripts.create-script-soruce
url of DDL Script file
scripts.drop-script-source
url of DDL Script file
javax.persistence.sql-load-script-source
SQL load script for database initialization

Database Action အနေနဲ့ none, create, drop-and-create, drop တို့ကို ရွေးချယ်သတ်မှတ်နိုင်ပါမယ်။ none မှာ Default တန်ဖိုးဖြစ်ပြီး Table Creation ကို ဘာမှ လုပ်မှာ မဟုတ်ပါဘူး။
create ဆိုရင်တော့ Entity ရဲ့ တန်ဖိုးနဲ့ Table နဲ့လိုအပ်တဲ့ Forign Key တွေ Sequence တွေကို တည်ဆောက်ပေးပါမယ်။drop-and-create ဆိုရင်တော့ Drop လုပ်ပြီးမှ Create လုပ်မှာ ဖြစ်ပါတယ်။  drop ဆိုရင်တော့ Drop လုပ်ပေးမှာဖြစ်ပါတယ်။ ဘယ်အချိန်မှာလုပ်တာလဲ ဆိုရင်တော့ EntityManagerFactory ကို တည်ဆောက်တဲ့အချိန်မှာ ဖြစ်ပါတယ်။

Developing State တွေမှာ Table တွေ Fix မဖြစ်သေးရင် drop-and-create နဲ့ Entity တွေကိုရေး Repository တွေနဲ့ Unit Test လုပ်ပြီး Entity တွေမှန်သွားပြီဆိုကာမှ သူ့ရဲ့တန်ဖိုးကို none လို့ပြောင်းရေးရင် Database ဆောက်တာ Table Colum ပြောင်းတာတွေအတွက် အသုံးဝင်ပါလိမ့်မယ်။

နောက်တစ်ခု အသုံးဝင်တာကတော့ sql-load-script-source ဖြစ်ပါတယ်။ Application တည်ဆောက်စဥ် လိုအပ်တဲ့ Init Data တွေကို SQL အနေနဲ့ ရေးသားထားပြီး၊ အဲဒီ SQL File နေရာကို သတ်မှတ်ပေးနိုင်ပါတယ်။ Maven နဲ့ Project ဆောက်ထားမယ်ဆိုရင်တော့ src/main/resources အောက်မှာထားပြီးတော့ File Name ကို Relative Path အနေနဲ့ သတ်မှတ်နိုင်ပါတယ်။


Other Configurations


Configurations
Values
javax.persistence.validation.group.pre-persist
Group of Validation Classes which want to execute pre persist state
javax.persistence.validation.group.pre-update
Group of Validation Classes which want to execute pre update state
javax.persistence.validation.group.pre-remove
Group of Validation Classes which want to execute pre remove state
javax.persistence.lock.timeout

javax.persistence.query.timeout


အခြား Configuration များ အနေနဲ့ အသုံးပြုနိုင်တာကတော့ Validation နဲ့ ပတ်သက်တဲ့ Configuration တွေအပြင် Lock Timeout ပြီးတော့ Query Timeout တို့ကိုလဲ သတ်မှတ်နိုင်ပါသေးတယ်။

တဖန် JPA Provider အနေနဲ့ Hibernate Entity Manager ကို အသုံးပြုမယ်ဆိုရင် Hibernate ရဲ့ Configuration များကိုလဲ​ အသုံးပြုနိုင်မှာ ဖြစ်ပါတယ်။ အသုံးဝင်တဲ့ Configuration တွေကတော့ အောက်ပါအတိုင်း ဖြစ်ပါတယ်။

Configurations
Values
hibernate.show_sql
true, false ကို သတ်မှတ်နိုင်ပြီး၊ အသုံးပြု သွားတဲ့ SQL တွေကို ဖေါ်ပြနိုင်
hibernate.format_sql
true, false ကို သတ်မှတ်နိုင်ပြီး SQL တွေကို Format ချပြီး ပြသနိုင်
hibernate.order_update
true, false ကို သတ်မှတ်နိုင်ပြီး Concurrent Application တွေမှာ Dead Lock မဖြစ်အောင် စီမံနိုင်
hibernate.use_sql_comments
SQL Comment  တွေကို ဖေါ်ပြနိုင်ပြီး Debug လုပ်ရာမှာ လွယ်ကူစေပါတယ်


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

No comments:

Post a Comment