Wednesday, June 30, 2010

Жава фэрсистэнс технологи

Жава фэрсистэнс нь анх 2006 онд JPA 1.0 (Java Persistence API) нэртэйгээр танилцуулагдсан. Одоогийн байдлаар 2.0 хувилбараа хөгжүүлээд байгаа бөгөөд энэ нь холбоост өгөгдлийн сан болон объект хандалтат өгөгдлийн хоорондын гүүр болж ажилладаг хөгжүүлэгчид зориулсан бэлэн классуудаас бүрддэг. Өөрөөр хэлбэл Жава програмын хэлнээс холбоост өгөгдлийн сан удирдах боломжыг хөгжүүлэгчдэд олгодог классын сан юм. Жава фэрсистэнс нь javax.persistence пакежид тодорхойлогдсон байдаг.

Ажиллагааны үндсэн зарчим нь сервер дахь холбоост өгөгдлийн сангын өгөгдлийг програм дээр авч ирээд програм болон өгөгдлийн сангийн хооронд трансакшен үүсгэдэг. Хэрэглэгчийн хүсэлтээр клиент програм тал дээр өгөгдлийг өөрчилнө. Ингээд хэрэглэгч баталгаажуулах үед үүссэн трансакшенаа өгөгдлийн санд үйлдэл болгон хэрэгжүүлж өөрчлөлтийг хадгалдаг. Хөгжүүлэгчдэд өгөгдлийн сангийн уг тарансакшен гэсэн ойлголтыг Жава хэлнээс удирдах боломж бүрдүүлснээрээ том давуу талыг олгосон байна.

Нэгж (Entity) класс

Жава фэрсистэнс технологи нь холбоост өгөгдлийн санд байгаа хүснэгтүүдийг нэгж классаар дүрслэх бөгөөд энд тухайн хүснэгтийн түлхүүр талбар, холбоос гэх мэт физик бүтэцийг дэлгэрэнгүйгээр харуулдаг. Код 1-д нэгж классын жишээ харууллаа.

@Entity

@Table(name = " Employee ") //хүснэгтийн нэр

public class Employee {

@Id //түлхүүр талбар

@GeneratedValue(strategy = GenerationType.IDENTITY) //давтагдахгүй

@Column(name = "id") //талбарын нэр

private int id;

@Column(name = "name")

private String name;

@Column(name = "salary")

private long salary;

public Employee() {}

public Employee(int id) { this.id = id; }

public int getId() { return id; }

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

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public long getSalary() { return salary; }

public void setSalary (long salary) { this.salary = salary; }

}

Код 1. Нэгж классын жишээ

Дээрх кодод @Table(name = "") бичиглэлээр хүснэгтийн нэр, @Id бичиглэлээр түлхүүр талбар, @Column(name = "") бичиглэлээр хүснэгтийн талбарын нэрийг буулгалт хийгээд завсрын утга дамжуулах хувьсагчыг нэгж классын гишүүн өгөгдөл болгон зарласан байна.

Нэгж классын удирдлага

Энд нэгж классын удирдлага гэсэн ойлголт орж ирэх бөгөөд нэгж классаар дамжуулан өгөгдлийн санг удирдах үндсэн зорилготойгоо Жава фэрсистэнс EntityManager интерфейсийг тодорхойлсон байна. Хэрэглэгчийн өөрийн хандаж ажиллах санд зориулан нэгж класс болон классын удирдлага үүсгэж өгдөг. Жава фэрсистэнс технологийн классын диаграмыг харууллаа.


Зураг 1. Жава фэрсистэнсийн классын диаграм

Зурагт бүх EntityManagerFactory классаар EntityManager класс нь тохируулагддаг нь харагдаж байна. Өөрөөр хэлбэл энд EntityManagerFactory класс нь олон төрлийн ялгаатай EntityManager классүүдийг нэгтгэж ерөнхийлж өгсөн байна. Ингэж EntityManager үүсгэх үйлдлийг Жава платформ бидний өмнөөс хийдэг. Мөн фэрсистэнс хэмжигдэхүүн (Persistence unit) гэсэн ойлголт байдаг энэ нь нэгж классуудын жагсаалтын болон бусад туслах мэдээллийг хадгалсан файл байдаг. Жава платформ уг файлын мэдээллийг ашиглаж EntityManagerFactory классыг хэрэгжүүлдэг. Зурагт PersistenceContext гэдгээр бидний нэгж класс, өгөгдлийн сангийн асуулга болон өгөгдлийг нь төлөөлүүлсэн байна. Фэрсистэнс хэмжигдэхүүний дагуу нэгж классууд үүсэх бөгөөд EntityManager классаар зохицуулагддаг (удирдагддаг) гэдэг нь харагдаж байна.

Жава фэрсистэнс ашиглан өгөгдлийн санд хандах

Жава фэрсистэнс нэгж класс болон нэгж классын удирдлагын тусламжтайгаар өгөгдлийн санд хандаж ажилладаг. Үүний тулд нэгж классын удирдлага болох EntityManager классыг EntityMangerFactory классаас үүсгэдэг. Код 2-т харууллаа.

EntityManagerFactory emf =

Persistence.createEntityManagerFactory("EmployeeService");

EntityManager em = emf.createEntityManager();//EntityManager үүсгэх


Код 2. EntiyManagerFactory классаас EntityManager үүсгэх

Кодод EntityManagerFacotry классыг Persistence классын статик гишүүн функцид фэрсистэнс хэмжигдэхүүн файлын нэр болох “EmployeeService”-ийг дамжуулж өгсөн байна. Ингэж EntityManager классыг үүсгэснээрээ өгөгдлийн санд хандаж ажиллах боломжтой болно.

Бичлэг оруулах оруулах жишээ кодыг Код 3-т харууллаа.

public Employee createEmployee(int id, String name, long salary) {

Employee emp = new Employee(id);// нэгж классын объект үүсгэх

emp.setName(name); //талбаруудад утга оноох

emp.setSalary(salary);

em.persist(emp); //EntityManager класстай холбож өгөх

return emp;

}


Код 3. Шинэ бичлэг нэмэх

Код 1-д тодорхойлсон Employee нэгж классын объектийг үүсгээд, талбаруудад нь утга оноогоод эцэст нь нэгж удирдлагын класс болох EntityManager классд холбож өгч байна.

Бичлэг устах жишээ кодыг Код 4-т харууллаа.

public void removeEmployee(int id) {

Employee emp = em.find(Employee.class, id);//бичлэг хайж олох

if (emp != null) { //бичлэг олдсон эсэх

em.remove(emp); //бичлэг олсон бол устгах

}

}

Код 4. Бичлэг устгах

Код 4 нь бичлэг устгах үйлдэл хийж байна. Ингэхдээ тухайн бичлэг байгаа эсэхийг EntityManager классын find функцаар шалгаад бичлэг олдсон бол тухайн бичлэгийг remove функцаар устгаж байна. Код 5-д бичлэгт өөрчлөлт хийх жишээ харууллаа.

public Employee raiseEmployeeSalary(int id, long raise) {

Employee emp = em.find(Employee.class, id);

if (emp != null) {

emp.setSalary(emp.getSalary() + raise);//Цалингийн утгыг //нэмэгдүүэх

}

return emp;

}

Код 5. Өөрчлөлт хийх

Тухайн ажилтны цалинг нэмэгдүүлэхдээ setSalary функцыг ашиглаж байна.

Дээр хийгдсэн шинэ бичлэг нэмэх, бичлэг устгах, өөрчлөлт хийх үйлдэлүүд нь зөвхөн трансакшен дээр хийгдсэн үйлдэл бөгөөд өгөгдлийн санд ямар өөрчлөлт хийж чадахгүй юм. Одоо EnityManager ашиглан тухайн тарансакшенийг өгөгдлийн санд өөрчлөлт болгон хэрэгжүүлэх шаардлагатай. Энэ үйлдлийг хийх жишээ кодыг Код 6-д харуулав.

em.getTransaction().begin();//трансакшен эхлүүлэх

createEmployee(158, "John Doe", 45000);//шинэ ажилтан үүсгэх

em.getTransaction().commit();//трансакшен хэрэгжүүлэх


Код 6. Трансакшен удирдах

Уг кодод EntityManager дахь трансакшен эхлүүлээд, шинэ ажилтаны бичлэг үүсгэж холбож өгөөд сүүлд нь трансакшен хэрэгжүүлснээр өгөгдлийн санд өөрчлөлт хийгдэж байна.

Өгөгдлийн сангийн асуулга (Query)

Жава фэрсистэнс технологи нь Жава коддоо асуулга бичих боломжыг олгосон Жава фэрсистэнс асуулгын хэлийг (Java Persistence Query Language) хөгжүүлж гаргасан. Бичлэгийн дүрмийн хувьд стандарт SQL бичлэгтэй төстэй боловч уг асуулга нь програм програм ямар өгөгдлийн сангийн технологи дээр хэрэгжүүлэгдсэнээс хамааран тухайн технологийн бичлэгийн дүрэмд хөрвүүлэгдэж ажилдгаараа давуу талтай. Өөрөөр хэлбэл бид фэрсистэнс асуулгын хэлийг ашигласан бол програм програмынхаа өгөгдлийн сангийн технологийг дураараа өөрчилж болно.

No comments:

Post a Comment