Full Stack Development with Spring Boot and React (အခန်း ၂)
Published: 2022-12-24 04:38:53

**JPA**
JPA ဆိုတာ standard တစ်ခုဖြစ်ပါတယ်။ JPA ကို အခြေခံပြီး Hibernate, Eclipse-Link အစရှိသဖြင့် implementation လုပ်ကြပါတယ်။ အဲဒီထဲမှာ အသုံးအများဆုံးက Hibernate
implementation ဖြစ်ပါတယ်။ ဥပမာ HTML language ဆိုတာ standard ဖြစ်ပြီး သူ့ကို render လုပ်တဲ့ browser implementation တွေမတူကြသလိုပါပဲ။ 
ဥပမာ Firefox, Chrome, Edge အစရှိသဖြင့်ပေါ့။ JPA ကိုပြန်ပြောရမယ်ဆိုရင်တော့ JPA entity ဆိုတာ database table ကို ကိုယ်စားပြုတဲ့ Java class ဖြစ်ပါတယ်။
အဲဒီ class ရဲ့ field တွေကတော့ database table ရဲ့ column တွေကို ကိုယ်စားပြုပါတယ်။ ပြီးရင် example နဲ့တကွပြပါ့မယ်။

**Hibernate**
Hibernate ဟာ JPA implementation တွေထဲမှာ ပေါ်ပြူလာအဖြစ်ဆုံး ဖြစ်ပြီး Spring Boot က သူ့ကို default အနေနဲ့ ထည့်ထားပေးပါတယ်။ Hibernate ဟာ mature ဖြစ်နေပြီ
ဖြစ်တဲ့အပြင် large-scale  application ကြီးတွေမှာ ကို သုံးကြပါတယ်။

**Entity class များ create လုပ်ခြင်း**
Entity class class ဆိုတာ JPA ရဲ့ @Entity ဆိုတဲ့ annotation ကို class definition မှာရေးထားတဲ့ class ကိုခေါ်ပါတယ်။
Entity class မှာ getter နဲ့ setter method တွေပါရမှာဖြစ်ပြီး။ သူ့ရဲ့ field တွေကိုတော့ private ကြေငြာထားရပါမယ်။

Application ကို စ run လိုက်တာနဲ့ JPA ဟာ database မှာ table တွေ သွားဆောက်ပါတယ်။ @Entity နဲ့ ရေးထားတဲ့ class တွေ အကုန်လုံး
database table အဖြစ်နဲ့ database ထဲ အလိုအလျောက်သွားဆောက်မှာဖြစ်ပါတယ်။

ဥပမာ Entity class name က Car ဆိုရင် Car ဆိုတဲ့ 
table ကို အလိုလိုသွားဆောက်မှာပါ။ တကယ်လို့ ကိုယ်က Car လို့ မဆောက်ချင်ဘူး။ MotorCar လို့ ဆောက်ချင်တယ်ဆိုရင် @Entity ရဲ့ အောက်မှာ
@Table ဆိုတဲ့ annotation ကို သုံးပြီး table name ကို သီးသန့် set လုပ်လို့ရပါတယ်။

ကဲ အဲဒီတော့ example စကြည့်ကြရအောင်။
JPA နဲ့ H2 database နဲ့ သုံးဖို့ ပထမဆုံး pom.xml ဖိုင်ထဲမှာ dependencies တွေ ထပ်ထည့်ရအောင်။ 

```xml

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <scope>runtime</scope>
</dependency>
```

Entity class ကို create လုပ်ပုံအဆင့်ဆင့် ကို ကြည့်ရအောင်။

Project Explorer မှာ root package ကို right click နှိပ်ရင် menu ပေါ်လာပါလိမ့်မယ်။
New ကို ရွေးပြီး အဲဒီထဲကမှ package ကို ရွေးပါ


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0eci8sui55b96ljjbh0c.png)



package name ကို com.packt.demo.domain လို့ပေးလိုက်ပါ။

အသစ်ဆောက်ထားတဲ့ package ကို Project Explorer မှာ right click နှိပ်ပါ။ ပြီးရင် New ကိုရွေးပြီး class ကိုရွေးလိုက်ပါ။ ဒါဆိုရင် Java class အသစ်တစ်ခုရပြီ။


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fod0g0g1to2qr4gddw11.png)


ပြီးရင် annotation ဖြစ်တဲ့ @Entity ကို Car class ပေါ်မှာ သတ်မှတ်ပေးလိုက်ပါ။
(@Entity ရေးပြီး Ctrl+Space ဒါမှမဟုတ် Ctrl+Shift+O ကို နှိပ်ရင် import statement အော်တိုထွက်လာပါလိမ့်မယ်။) 

```java
package com.packt.demo.domain;
import javax.persistence.Entity;

@Entity
public class Car {

}
```
ပြီးရင် field တွေ(database column ဖြစ်လာမယ့်အရာတွေ) ကို define လုပ်ရအောင်။ ဒီနေရာမှာ unqiue ID ကိုလည်း ထည့်ပေးရပါလိမ့်မယ်(primary key အနေနဲ့သုံးရအောင်ပါ)။

```
package com.packt.demo.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Car {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private long id;
	private String brand, model, color, registerNumber;
	private int yearMade, price;
}
```

primary key ကို define လုပ်ဖို့ @Id
ID ကို database ကနေ Auto generate လုပ်ပေးဖို့ @GeneratedValue
JPA provider(ဒီနေရာမှာ Hibernate) က အသင့်တော်ဆုံး ID generation ကို လုပ်ပေးပါလို့ပြောတာက  (strategy=GenerationType.AUTO)

ပြီးပြီဆိုရင် field တွေအတွက် getter နဲ့ setter တွေ ထည့်ပေးရမယ်။ field တွေကို တိုက်ရိုက် set လုပ်ပေးနိုင်မယ့် constructor ထည့်ပေးရမယ်။

class ထဲမှာ cursor ကိုထားပြီး Right Click-> Source -> Generate Getter and Setters
ဆိုရင် getter setter တွေထွက်လာမယ်။

class ထဲမှာ cursor ကိုထားပြီး Right Click-> Source -> Generate Constructor using fields....
လို့ရွေး ပြီးရင် ID ကို ဖြုတ်(id က auto generate လုပ်မှာ ဆိုတော့ constructor နဲ့ assign လုပ်ရင် ထည့်မပေးရဘူး)

```java
package com.packt.demo.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Car {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long id;
	private String brand, model, color, registerNumber;
	private int yearMade, price;

	public Car() {
	}

	public Car(String brand, String model, String color, String registerNumber, int yearMade, int price) {
		super();
		this.brand = brand;
		this.model = model;
		this.color = color;
		this.registerNumber = registerNumber;
		this.yearMade = yearMade;
		this.price = price;
	}

	public String getBrand() {
			return brand;
		}

		public void setBrand(String brand) {
			this.brand = brand;
		}

		public String getModel() {
			return model;
		}

		public void setModel(String model) {
			this.model = model;
		}

		public String getColor() {
			return color;
		}

		public void setColor(String color) {
			this.color = color;
		}

		public String getRegisterNumber() {
			return registerNumber;
		}

		public void setRegisterNumber(String registerNumber) {
			this.registerNumber = registerNumber;
		}

		public long getId() {
			return id;
		}

		public void setId(long id) {
			this.id = id;
		}

		public int getYearMade() {
			return yearMade;
		}

		public void setYearMade(int yearMade) {
			this.yearMade = yearMade;
		}

		public int getPrice() {
			return price;
		}

		public void setPrice(int price) {
			this.price = price;
		}
}
```
ပြီးရင် H2 database နဲ့ချိတ်ဖို့ application.properties ထဲမှာ အောက်ပါအတိုင်း configure လုပ်ကြမယ်။

```properties
spring.h2.console.enabled=true
spring.datasource.platform=h2
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.h2.console.path=/h2-console
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update

```
h2 မှာ webconsole ပါပါတယ်။ database url name က jdbc:h2:mem:test ဆိုတာကိုလည်း သတိထားမိမယ်ထင်ပါတယ်။ ကဲ Run As ->Java Application လုပ်လိုက်ပါ။ H2 database ထဲမှာ ဘာရောက်သွားလည်းကြည့်ရအောင်။
အရင်ဆုံး Spring Boot run ပြီးရင် http://localhost:8080/h2-console ကို browser မှာ ဖွင့်ကြည့်ပါ


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mosft2ni1ntjb0cjyzyv.png)


url ကို jdbc:h2:mem:test လို့ပြောင်းပြီး ဝင်လိုက်ပါ။



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a43bylo90rdtmriljq4a.png)



JPA က လှမ်းပြီး create လုပ်ပေးလိုက်တဲ့ database table ဖြစ်တဲ့ Car table ကို တွေ့ရမှာဖြစ်ပါတယ်။

=======================
အခန်း(၂) ပြီး