ก่อนอื่นต้องขอกล่าวอย่างสั้นๆว่าถ้าเราเขียนโปรแกรมด้วยภาษาเชิงobjectและทำงานกับ Databaseแบบ Relational สิ่งที่เราต้องพบคือการทำงานบนแนวความคิดสองแบบที่ค่อนข้างจะ
แตกต่างกันอย่างมาก กล่าวคือDatabase Relational จะเน้นการมองภาพและเก็บข้อมูลเป็น Triple Set และ Relation ซึ่งแนวความคิดในลักษณะนี้มีข้อดีคือมีทฤษฎีทางคณิตศาสตร์เข้ามาอธิบายพฤติกรรมต่างได้ทั้งหมด ในทางกลับกันการเขียนโปรแกรมแบบobjectกลับพยายามมองทุกอย่างให้เป็นธรรมชาติมากขึ้นโดยที่ไม่ได้เน้นหนักไปที่การอธิบายด้วยทฤษฎีทางคณิตศาสตร์ ดังนั้นจึงส่งผลให้เมื่อใดก็ตามที่เราพยายามที่จะจัดเก็บข้อมูลแบบobjectลง ในฐานข้อมูลแบบรีเลชั่นนอลโยตรง เราจะต้องแก้ปัญญาเรื่องช่องว่างระหว่าง object-รีเลชั่นนอลแต่อย่างไรก็ตามปัญหานี้หาสามารถแก้ไขได้ด้วยการใช้สิ่ง ที่เรียกว่า “object - Relational Mapping”
คำถามที่จะตามต่อมาคือช่องว่างที่เกิดขึ้น เกิดขึ้นที่จังหวะใดของการทำงาน คำตอบคือโดยปกติแล้วในการเขียนโปรแกรมทั่วๆไปเมื่อobjectของเราถูกส่งไปมาใน แอพพลิเค
ชั่นจนถึงจุดที่เราต้องการจะทำการเซฟข้อมูลลงไปในฐานข้อมูลสิ่งที่เราต้องทำ คือ เปิดคอนเน็คชั่นเจดีบีซี จากนั้นทำการโหลดค่าต่างๆออกจากobjectและใส่ลงใน เสตทเมนท์เอสคิวแอลและสุดท้ายคือการคอมมิท การทำงานในลักษณะนี้ไม่มีข้อยุ่งยากใดๆในกรณีที่objectมีขนาดเล็กและไม่มี ความสัมพัน
ธ์กับobjectอื่นๆ แต่ในทางกลับกันสมมุติว่าเรามี object cat ซึ่งจะต้องเก็บเซ็ทของลูกแมวด้วยถ้าเราต้องการจะทำตามกระบวนการข้างต้นความซับซ้อนในการดึงข้อมูลจะมีค่าสูงมากและในบางครั้งเราอาจไม่ต้องการเก็บค่าลูกแมวลงไปเราจะทำอย่างไรและเราอาจจะต้องเสียเวลากับการตรวจสอบความถูกต้องของคีย์และข้อมูลอีกต่างหาก
นอกจากนี้การดึงข้อมูลขึ้นมาเก็บในobjectก็มีปัญหาเกิดขึ้นเช่นกันกรณีเดียวกันคือออ
บเจคแมวและเซ็ทของลูกแมว ว่าจะโหลดขึ้นมาจังหวะไหนดีจะเห็นได้ว่าปัญหานี้ขยายวงกว้างออกไปอย่างรวดเร็วโดยเฉพาะในการทำงานกับโปรเจคขนาดใหญ่และมีอัตราการเปลี่ยนแปลงสูง การแก้ไขเพียงแค่ชนิดของข้อมูลอาจส่งผลให้เราต้องเสียเวลาเป็นวันในการแก้ไข โคดในส่วนของการแอคเซสข้อมูลในส่วนนั้น และจากผลการวิจัยพบว่า35%ของการพัฒนาซอฟท์แวร์ต้องเสียไปกับการ Coding เพื่อดึงข้อมูลไปมาระหว่างobjectกับฐานข้อมูล
แล้ว ORM สามารช่วยอะไรเราได้บ้างคำตอบคือข้อดีของโออาร์เอ็มคือเราสามารถมองทุกอย่างเป็นออบเจคก่อนจากนั้นโออาร์เอ็มจะทำการแมปรายละเอียดต่างๆลงสู่ฐานข้อมูลเช่นเอง ดังนั้นโคดของเราสามารถเขียนได้ใหม่ดังนี้
เมื่อเราต้องการเก็บข้อมูลของobjectลงในฐานข้อมูล
แตกต่างกันอย่างมาก กล่าวคือDatabase Relational จะเน้นการมองภาพและเก็บข้อมูลเป็น Triple Set และ Relation ซึ่งแนวความคิดในลักษณะนี้มีข้อดีคือมีทฤษฎีทางคณิตศาสตร์เข้ามาอธิบายพฤติกรรมต่างได้ทั้งหมด ในทางกลับกันการเขียนโปรแกรมแบบobjectกลับพยายามมองทุกอย่างให้เป็นธรรมชาติมากขึ้นโดยที่ไม่ได้เน้นหนักไปที่การอธิบายด้วยทฤษฎีทางคณิตศาสตร์ ดังนั้นจึงส่งผลให้เมื่อใดก็ตามที่เราพยายามที่จะจัดเก็บข้อมูลแบบobjectลง ในฐานข้อมูลแบบรีเลชั่นนอลโยตรง เราจะต้องแก้ปัญญาเรื่องช่องว่างระหว่าง object-รีเลชั่นนอลแต่อย่างไรก็ตามปัญหานี้หาสามารถแก้ไขได้ด้วยการใช้สิ่ง ที่เรียกว่า “object - Relational Mapping”
คำถามที่จะตามต่อมาคือช่องว่างที่เกิดขึ้น เกิดขึ้นที่จังหวะใดของการทำงาน คำตอบคือโดยปกติแล้วในการเขียนโปรแกรมทั่วๆไปเมื่อobjectของเราถูกส่งไปมาใน แอพพลิเค
ชั่นจนถึงจุดที่เราต้องการจะทำการเซฟข้อมูลลงไปในฐานข้อมูลสิ่งที่เราต้องทำ คือ เปิดคอนเน็คชั่นเจดีบีซี จากนั้นทำการโหลดค่าต่างๆออกจากobjectและใส่ลงใน เสตทเมนท์เอสคิวแอลและสุดท้ายคือการคอมมิท การทำงานในลักษณะนี้ไม่มีข้อยุ่งยากใดๆในกรณีที่objectมีขนาดเล็กและไม่มี ความสัมพัน
ธ์กับobjectอื่นๆ แต่ในทางกลับกันสมมุติว่าเรามี object cat ซึ่งจะต้องเก็บเซ็ทของลูกแมวด้วยถ้าเราต้องการจะทำตามกระบวนการข้างต้นความซับซ้อนในการดึงข้อมูลจะมีค่าสูงมากและในบางครั้งเราอาจไม่ต้องการเก็บค่าลูกแมวลงไปเราจะทำอย่างไรและเราอาจจะต้องเสียเวลากับการตรวจสอบความถูกต้องของคีย์และข้อมูลอีกต่างหาก
นอกจากนี้การดึงข้อมูลขึ้นมาเก็บในobjectก็มีปัญหาเกิดขึ้นเช่นกันกรณีเดียวกันคือออ
บเจคแมวและเซ็ทของลูกแมว ว่าจะโหลดขึ้นมาจังหวะไหนดีจะเห็นได้ว่าปัญหานี้ขยายวงกว้างออกไปอย่างรวดเร็วโดยเฉพาะในการทำงานกับโปรเจคขนาดใหญ่และมีอัตราการเปลี่ยนแปลงสูง การแก้ไขเพียงแค่ชนิดของข้อมูลอาจส่งผลให้เราต้องเสียเวลาเป็นวันในการแก้ไข โคดในส่วนของการแอคเซสข้อมูลในส่วนนั้น และจากผลการวิจัยพบว่า35%ของการพัฒนาซอฟท์แวร์ต้องเสียไปกับการ Coding เพื่อดึงข้อมูลไปมาระหว่างobjectกับฐานข้อมูล
แล้ว ORM สามารช่วยอะไรเราได้บ้างคำตอบคือข้อดีของโออาร์เอ็มคือเราสามารถมองทุกอย่างเป็นออบเจคก่อนจากนั้นโออาร์เอ็มจะทำการแมปรายละเอียดต่างๆลงสู่ฐานข้อมูลเช่นเอง ดังนั้นโคดของเราสามารถเขียนได้ใหม่ดังนี้
เมื่อเราต้องการเก็บข้อมูลของobjectลงในฐานข้อมูล
session.save(cat);
โออาร์เอ็มจะทำการสร้างเอสคิวแอลสเตทเมนท์ที่เหมาะสมและจัดเก็บข้อมูล และเราสามารถโหลดข้อมูลได้ดังนี้
myObject = orm.load(MyObject.class, objectId);
นอกจากนี้การคิวรีของโออาร์เอ็มยังดูง่ายด้วยเช่น
List myObjects = orm.find(
"FROM MyObject object WHERE object.property = 5");
"FROM MyObject object WHERE object.property = 5");
ต่อไปเป็นตัวอย่างที่ค่อข้างซับซ้อน
List myObjects = orm.find(
"FROM Person person
WHERE person.marriedTo.address.street LIKE %something%");
"FROM Person person
WHERE person.marriedTo.address.street LIKE %something%");
จากตัวอย่างนี้จะเห็นได้ว่าสิ่งที่ได้จากการดึงข้อมูลคือเซ็ทของobjectที่พร้อมใช้งา
นได้เลย และจากสี่ตัวอย่างนี้ อาจทำให้เห็นภาพโออาร์เอ็มมากขึ้น
ทำไมต้องใช้ Hibernate
จริงๆแล้วโออาร์เอ็มเองได้ถูกพัฒนาและแตกสายออกไปมากมายซึ่งแต่ละตัวจะมีข้อดีข้อด้อ
ยแตกต่างกันไปแต่บทความนี้จะขออิงกับสิ่งที่เรียกว่า Hibernate สาเหตุเพราะ Hibernate เป็นโอเพนซอสอย่างเต็มตัวและมีเอกสารประกอบที่ค่อน ข้างสมบูรณ์
มากๆ และมีกลุ่มคนที่ใช้มากรวมทั้งเวบบอร์ดเองก็มีประสิทธิภาพมากมีคนเข้ามาร่วมตอบปัญหาค่อนข้างมาก นอกจากนี้เทคนิคที่ใช้ในการแมปเองก็ไม่ได้ทำการเปลี่ยนแปลงตัวโครงสร้างของobjectเหมือนอย่าง เจดีโอ
ภาพประกอบด้านล่างเป็นการแสดงถึงภาพรวมแบบกว้างๆของ Hibernate โดยจะเห็นได้ว่า Hibernate จะทำตัวเป็นตัวกลางระหว่างแอพพลิเคชั่นกับตัวฐานข้อมูลโดยอาศัยรายละเอียดของการจัดเก็บข้อมูลจาก XML Mapping ไฟล์ซึ่งมีลักษณะดังตัวอย่าง
![Posted Image](file:///C:\Users\MRE3ED~1.BOO\AppData\Local\Temp\msohtmlclip1\01\clip_image001.gif)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="my.first.hibernate.Event" table="EVENTS">
<id name="id" column="uid" >
<generator class="increment"/>
</id>
<property name="date" type="date"/>
<property name="title" type="string"/>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="my.first.hibernate.Event" table="EVENTS">
<id name="id" column="uid" >
<generator class="increment"/>
</id>
<property name="date" type="date"/>
<property name="title" type="string"/>
</class>
</hibernate-mapping>
และ hibernate.properties ใช้สำหรับกำหนดคุณสมบัติการทำงานของตัว Hibernate
ไม่มีความคิดเห็น:
แสดงความคิดเห็น