3.1 การเชื่อมโยง Hibernate และฐานข้อมูล

เราได้เรียนรู้วิธีเชื่อมต่อ Hibernate กับแอปพลิเคชันของเราโดยใช้ Maven และวิธีแมปตารางกับคลาสโดยใช้คำอธิบายประกอบ และตอนนี้คำถามต่อไปก็เกิดขึ้น - เราจะอ่านวัตถุจากฐานข้อมูลหรือบันทึกไว้ที่นั่นได้อย่างไร

ไม่เร็วนัก ก่อนอื่นคุณต้องจัดการกับอีกสามสิ่ง:

  • การกำหนดค่าการเชื่อมต่อฐานข้อมูล
  • การตั้งค่าไฮเบอร์เนต
  • การทำงานกับ EntityManager

ไฮเบอร์เนตจะซ่อนการทำงานกับฐานข้อมูลจากแอปพลิเคชันของคุณโดยสมบูรณ์ แต่เพื่อหลีกเลี่ยงการทำงานที่มากเกินไป จะต้องกำหนดค่าอย่างถูกต้อง คุณไม่สามารถข้ามขั้นตอนนี้ได้ ไม่เช่นนั้น Hibernate จะรู้ได้อย่างไรว่าฐานข้อมูลใดที่จะบันทึกวัตถุ

Hibernate สามารถกำหนดค่าและให้ข้อมูลฐานข้อมูลได้สามวิธี

  • ใช้ไฟล์คุณสมบัติ
  • ใช้ไฟล์ hibernate.cfg.xml
  • ใช้วิธี Configuration bean

และแม้ว่าฉันจะชอบอันสุดท้ายมากที่สุด แต่คุณจะต้องเจอทั้งสามอย่างแน่นอน ดังนั้นเราจะวิเคราะห์ทั้งสามที่นี่

3.2 การอนุญาตในฐานข้อมูล

เริ่มจากสิ่งที่สำคัญที่สุด - การเชื่อมต่อฐานข้อมูล ในการทำเช่นนี้ คุณจะต้องให้ข้อมูลเพื่อให้ Hibernate สามารถเข้าสู่ระบบฐานข้อมูลที่ต้องการได้

การกำหนดค่าไฟล์คุณสมบัติ
จำศีล.คุณสมบัติ
hibernate.dialect= org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class= oracle.jdbc.driver.OracleDriver
hibernate.connection.url= jdbc:oracle:thin:@localhost:1521:supershop
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=update

การตั้งค่าเดียวกันสามารถตั้งค่าได้ในรูปแบบของไฟล์ xml:

การกำหนดค่าตาม XML
hibernate.cfg.xml
<hibernate-configuration>
	<session-factory>

    	<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
    	<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    	<property name="connection.url">jdbc:oracle:thin:@localhost:1521:supershop</property>
    	<property name="connection.username">root</property>
    	<property name="connection.password">secret</property>
    	<property name="hibernate.show_sql ">true</property>
    	<property name="hbm2ddl.auto">update</property>

	</session-factory>
</hibernate-configuration>

ในทั้งสองตัวอย่าง เราเห็นการตั้งค่าเดียวกันด้วยค่าเดียวกัน เป็นเพียงตัวอย่างแรกที่แสดงเป็นไฟล์คุณสมบัติและตัวอย่างที่สองเป็นไฟล์ xml

การตั้งค่าเหล่านี้แบ่งออกเป็นสามกลุ่ม:

  1. ระบุประเภทของ DBMS
    • ระบุภาษา (ประเภท DBMS) เช่น Oracle 9.0
    • ระบุชื่อไดรเวอร์ JDBC สำหรับการทำงานกับ DBMS นี้
  2. ระบุข้อมูลสำหรับการอนุญาตในฐานข้อมูล
    • URL ฐานข้อมูล
    • ชื่อผู้ใช้
    • รหัสผ่าน
  3. การกำหนดค่า 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 แล้ว เรามาเขียนโค้ดที่จะใช้กัน

จะประกอบด้วยสามวิธี:

  1. การกำหนดค่าไฮเบอร์เนต
  2. วิธีการรับพนักงานทั้งหมดจากฐานข้อมูล
  3. วิธีที่บันทึกพนักงานใหม่ลงในฐานข้อมูล

เทมเพลตรหัสนี้จะมีลักษณะดังนี้:

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();
     	}
   }
}

ก่อนดำเนินการสืบค้นไปยังฐานข้อมูล คุณต้องสร้างเซสชันแยกต่างหาก หากคำขอเกี่ยวข้องกัน ก็สามารถดำเนินการได้ในเซสชันเดียวกัน หากคำขอไม่เกี่ยวข้องกัน (และอาจใช้เวลาหลายนาทีระหว่างกัน) พวกเขาจำเป็นต้องสร้างเซสชันของตนเอง

หากคุณต้องการอ่านข้อมูลจากฐานข้อมูลหรือเรียกใช้คิวรีที่ซับซ้อน คุณต้องสร้างออบเจกต์คิวรีก่อนและใช้เพื่อดำเนินการคิวรีของคุณ

นอกจากนี้ การสอบถามไปยังฐานข้อมูลแต่ละรายการจะดำเนินการในธุรกรรมของตัวเอง คุณต้องเปิดดำเนินการที่จำเป็นแล้วปิด (ยืนยัน)

ในการบรรยายต่อไปนี้ เราจะวิเคราะห์รายละเอียดเพิ่มเติมว่าทั้งหมดนี้ทำงานอย่างไร