3.1 การเชื่อมโยง Hibernate และฐานข้อมูล
เราได้เรียนรู้วิธีเชื่อมต่อ Hibernate กับแอปพลิเคชันของเราโดยใช้ Maven และวิธีแมปตารางกับคลาสโดยใช้คำอธิบายประกอบ และตอนนี้คำถามต่อไปก็เกิดขึ้น - เราจะอ่านวัตถุจากฐานข้อมูลหรือบันทึกไว้ที่นั่นได้อย่างไร
ไม่เร็วนัก ก่อนอื่นคุณต้องจัดการกับอีกสามสิ่ง:
- การกำหนดค่าการเชื่อมต่อฐานข้อมูล
- การตั้งค่าไฮเบอร์เนต
- การทำงานกับ EntityManager
![](https://cdn.codegym.cc/images/article/2f7dae23-c127-4d4b-8041-9530f765996a/1024.jpeg)
ไฮเบอร์เนตจะซ่อนการทำงานกับฐานข้อมูลจากแอปพลิเคชันของคุณโดยสมบูรณ์ แต่เพื่อหลีกเลี่ยงการทำงานที่มากเกินไป จะต้องกำหนดค่าอย่างถูกต้อง คุณไม่สามารถข้ามขั้นตอนนี้ได้ ไม่เช่นนั้น Hibernate จะรู้ได้อย่างไรว่าฐานข้อมูลใดที่จะบันทึกวัตถุ
Hibernate สามารถกำหนดค่าและให้ข้อมูลฐานข้อมูลได้สามวิธี
- ใช้ไฟล์คุณสมบัติ
- ใช้ไฟล์ hibernate.cfg.xml
- ใช้วิธี Configuration bean
และแม้ว่าฉันจะชอบอันสุดท้ายมากที่สุด แต่คุณจะต้องเจอทั้งสามอย่างแน่นอน ดังนั้นเราจะวิเคราะห์ทั้งสามที่นี่
3.2 การอนุญาตในฐานข้อมูล
เริ่มจากสิ่งที่สำคัญที่สุด - การเชื่อมต่อฐานข้อมูล ในการทำเช่นนี้ คุณจะต้องให้ข้อมูลเพื่อให้ Hibernate สามารถเข้าสู่ระบบฐานข้อมูลที่ต้องการได้
การกำหนดค่าไฟล์คุณสมบัติ |
---|
จำศีล.คุณสมบัติ |
|
การตั้งค่าเดียวกันสามารถตั้งค่าได้ในรูปแบบของไฟล์ xml:
การกำหนดค่าตาม XML |
---|
hibernate.cfg.xml |
|
ในทั้งสองตัวอย่าง เราเห็นการตั้งค่าเดียวกันด้วยค่าเดียวกัน เป็นเพียงตัวอย่างแรกที่แสดงเป็นไฟล์คุณสมบัติและตัวอย่างที่สองเป็นไฟล์ xml
การตั้งค่าเหล่านี้แบ่งออกเป็นสามกลุ่ม:
- ระบุประเภทของ DBMS
- ระบุภาษา (ประเภท DBMS) เช่น Oracle 9.0
- ระบุชื่อไดรเวอร์ JDBC สำหรับการทำงานกับ DBMS นี้
- ระบุข้อมูลสำหรับการอนุญาตในฐานข้อมูล
- URL ฐานข้อมูล
- ชื่อผู้ใช้
- รหัสผ่าน
- การกำหนดค่า Hibernate Engine
hibernate.show_sql
- ไฮเบอร์เนตจะทำซ้ำในคอนโซลคำขอทั้งหมดที่ดำเนินการhbm2ddl.auto
- Hibernate จะเปลี่ยนโครงสร้างฐานข้อมูลหากจำเป็น
มีวิธีที่สามในการตั้งค่า - ผ่านถังขยะ โดยปกติจะใช้ร่วมกับ Spring ดังนั้นเราจะมาดูกันเมื่อเราเรียนรู้ SpringFramework
3.3 รับ SessionFactory
ขั้นตอนต่อไปคือการรับวัตถุ SessionFactory มีหลายวิธีในการทำเช่นนี้:
วิธีแรกคือการใช้ไฟล์ hibernate.properties
ในการทำเช่นนี้ คุณเพียงแค่ต้องเขียนโค้ดต่อไปนี้:
SessionFactory sessionFactory = new Configuration().buildSessionFactory();
หากไม่พบไฟล์ hibernate.properties ในไดเร็กทอรีโปรเจ็กต์ปัจจุบัน ข้อยกเว้นจะเกิดขึ้น
วิธีที่สองคือการกำหนดค่าโดยใช้ hibernate.cfg.xml
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
หากคุณเขียนโค้ดดังกล่าวhibernate.cfg.xml
. หากไม่พบไฟล์ดังกล่าว วิธีการbuildSessionFactory()
จะส่งข้อยกเว้น
วิธีที่สามคือการตั้งค่าไฟล์กำหนดค่าด้วยตนเอง
บางครั้งในระหว่างขั้นตอนการพัฒนา จำเป็นต้องเปลี่ยนไปใช้ฐานทดสอบหรือเปลี่ยนการตั้งค่าอื่นๆ สำหรับการทำงานกับฐาน โดยคุณสามารถตั้งค่าไฟล์กำหนดค่าด้วยตนเองได้:
SessionFactory sessionFactory = new Configuration().configure("hibernate-dev.cfg.xml").buildSessionFactory();
วิธีที่สี่ - เราใช้ไฟล์ hibernate.properties ที่กำหนดเอง:
ClassLoader classLoader = Thread.currentThread().getClassLoader();
Properties properties = new Properties();
properties.load(classLoader.getResourceAsStream("hibernate-dev.properties"));
SessionFactory sessionFactory = new Configuration()
.addProperties(properties)
.buildSessionFactory();
และสุดท้าย คุณสามารถเย็บพารามิเตอร์ที่จำเป็นทั้งหมดลงในโค้ดได้โดยตรง:
Properties properties = new Properties();
properties.put(Environment.DRIVER, "com.mysql.jdbc.Driver");
properties.put(Environment.URL, "jdbc:mysql://localhost:3306/supershop");
properties.put(Environment.USER, "root");
properties.put(Environment.PASS, "password");
SessionFactory sessionFactory = new Configuration()
.setProperties(properties)
.buildSessionFactory();
3.4 ระบุตำแหน่งที่จะค้นหาคลาสเอนทิตี
แต่นั่นไม่ใช่ทั้งหมด เมื่อเรากำหนด ค่าวัตถุ SessionFactoryใน Hibernate SessionFactory นี้ จะตรวจสอบว่ามีตารางที่จำเป็นทั้งหมดที่มีประเภทคอลัมน์ที่จำเป็นอยู่ในฐานข้อมูล
และเพื่อให้SessionFactoryสามารถทำสิ่งนี้ได้ จะต้องผ่านรายการคลาสเอนทิตีที่จำเป็นต้องแมปกับฐานข้อมูล
มีสามวิธีในการส่งรายชื่อคลาสเอนทิตี:
วิธีที่หนึ่ง เพิ่มhibernate.cfg.xml
บรรทัดเช่น:
<mapping class="class-qualified-name" />
ตัวอย่าง:
<mapping class="com.codegym.data.User" />
<mapping class="com.codegym.data.Employee" />
<mapping class="com.codegym.data.Task" />
วิธีที่สอง เรียกใช้เมธอดบนConfiguration object addAnnotatedClass()
ตัวอย่าง:
SessionFactory sessionFactory = new Configuration()
.configure()
.addAnnotatedClass(com.codegym.data.User.class)
.buildSessionFactory();
หากมีหลายคลาส คุณสามารถเพิ่มในแพ็คเกจทั้งหมดได้:
SessionFactory sessionFactory = new Configuration()
.configure()
.addPackage("com.codegym.data")
.buildSessionFactory();
3.5 ตัวอย่างสุดท้าย
ตอนนี้เราได้เรียนรู้วิธีกำหนดค่าวัตถุ SessionFactory แล้ว เรามาเขียนโค้ดที่จะใช้กัน
จะประกอบด้วยสามวิธี:
- การกำหนดค่าไฮเบอร์เนต
- วิธีการรับพนักงานทั้งหมดจากฐานข้อมูล
- วิธีที่บันทึกพนักงานใหม่ลงในฐานข้อมูล
เทมเพลตรหัสนี้จะมีลักษณะดังนี้:
class EmployeeManager {
private SessionFactory sessionFactory;
public void class init() {
this.sessionFactory = new Configuration()
.configure()
.buildSessionFactory();
}
public List<Employee> getAllEmployes() {
try (Session session = sessionFactory.openSession()) {
Query<Employee> query = session.createQuery("from Employee", Employee.class);
return query.list();
}
}
public void addEmployee(Employee employee ) {
try (Session session = sessionFactory.openSession()) {
Transaction transaction = session.beginTransaction();
session.save(employee);
transaction.commit();
}
}
}
ก่อนดำเนินการสืบค้นไปยังฐานข้อมูล คุณต้องสร้างเซสชันแยกต่างหาก หากคำขอเกี่ยวข้องกัน ก็สามารถดำเนินการได้ในเซสชันเดียวกัน หากคำขอไม่เกี่ยวข้องกัน (และอาจใช้เวลาหลายนาทีระหว่างกัน) พวกเขาจำเป็นต้องสร้างเซสชันของตนเอง
หากคุณต้องการอ่านข้อมูลจากฐานข้อมูลหรือเรียกใช้คิวรีที่ซับซ้อน คุณต้องสร้างออบเจกต์คิวรีก่อนและใช้เพื่อดำเนินการคิวรีของคุณ
นอกจากนี้ การสอบถามไปยังฐานข้อมูลแต่ละรายการจะดำเนินการในธุรกรรมของตัวเอง คุณต้องเปิดดำเนินการที่จำเป็นแล้วปิด (ยืนยัน)
ในการบรรยายต่อไปนี้ เราจะวิเคราะห์รายละเอียดเพิ่มเติมว่าทั้งหมดนี้ทำงานอย่างไร
GO TO FULL VERSION