3.1 Liên kết Hibernate và Cơ sở dữ liệu

Chúng tôi đã học cách kết nối Hibernate với ứng dụng của mình bằng Maven và cách ánh xạ các bảng tới các lớp bằng chú thích. Và bây giờ câu hỏi tiếp theo được đặt ra - làm cách nào để đọc các đối tượng từ cơ sở dữ liệu hoặc lưu chúng ở đó?

Không quá nhanh. Trước hết, bạn cần giải quyết thêm ba điều nữa:

  • Cấu hình kết nối cơ sở dữ liệu
  • Thiết lập ngủ đông
  • Làm việc với EntityManager

Hibernate ẩn hoàn toàn công việc với cơ sở dữ liệu khỏi ứng dụng của bạn, nhưng để tránh bất kỳ sự thái quá nào, nó phải được định cấu hình chính xác. Bạn không thể bỏ qua giai đoạn này - nếu không thì làm sao Hibernate biết cơ sở dữ liệu nào sẽ lưu các đối tượng vào?

Hibernate có thể được cấu hình và cung cấp thông tin cơ sở dữ liệu theo ba cách

  • Sử dụng tệp Thuộc tính
  • Sử dụng tệp hibernate.cfg.xml
  • Sử dụng các phương thức đậu cấu hình

Và mặc dù tôi thích cái cuối cùng nhất, nhưng bạn chắc chắn sẽ gặp phải cả ba, vì vậy chúng tôi sẽ phân tích cả ba ở đây.

3.2 Phân quyền trong cơ sở dữ liệu

Hãy bắt đầu với những kết nối cơ sở dữ liệu quan trọng nhất. Để làm điều này, bạn sẽ cần cung cấp dữ liệu để Hibernate có thể đăng nhập vào cơ sở dữ liệu mong muốn.

Cấu hình tệp thuộc tính
ngủ đông.properties
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

Các cài đặt tương tự có thể được đặt ở dạng tệp xml:

Cấu hình dựa trên XML
ngủ đông.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>

Trong cả hai ví dụ, chúng tôi thấy các cài đặt giống nhau với các giá trị giống nhau. Chỉ là ví dụ đầu tiên biểu thị chúng dưới dạng tệp thuộc tính và ví dụ thứ hai dưới dạng tệp xml .

Các cài đặt này được chia thành ba nhóm:

  1. Chỉ định loại DBMS
    • Chỉ định phương ngữ (loại DBMS), ví dụ: Oracle 9.0
    • Chỉ định tên của trình điều khiển JDBC để làm việc với DBMS này
  2. Chỉ định dữ liệu để ủy quyền trong cơ sở dữ liệu
    • url cơ sở dữ liệu
    • tên tài khoản
    • mật khẩu
  3. Định cấu hình Công cụ ngủ đông
    • hibernate.show_sql- Hibernate sẽ nhân đôi trong console tất cả các yêu cầu mà nó thực hiện
    • hbm2ddl.auto- Hibernate sẽ thay đổi cấu trúc cơ sở dữ liệu nếu cần thiết

Có một cách thứ ba để thiết lập cấu hình - thông qua các thùng. Nó thường được sử dụng cùng với Spring, vì vậy chúng ta sẽ xem xét nó khi học SpringFramework.

3.3 Lấy SessionFactory

Bước tiếp theo là lấy đối tượng SessionFactory. Có nhiều hướng khác nhau để làm điều đó:

Cách đầu tiên là sử dụng tệp hibernate.properties .

Để làm điều này, bạn chỉ cần viết đoạn mã sau:

SessionFactory sessionFactory = new Configuration().buildSessionFactory();

Nếu không tìm thấy tệp hibernate.properties trong thư mục dự án hiện tại, một ngoại lệ sẽ được đưa ra.

Cách thứ hai là cấu hình bằng hibernate.cfg.xml .

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

Nếu bạn viết mã như vậy, thì tệp hibernate.cfg.xml. Nếu không tìm thấy tệp nào như vậy, phương thức buildSessionFactory()sẽ đưa ra một ngoại lệ.

Cách thứ ba là đặt tệp cấu hình theo cách thủ công .

Đôi khi trong quá trình phát triển, cần phải chuyển sang cơ sở thử nghiệm hoặc thay đổi một số cài đặt khác để làm việc với cơ sở, vì điều này, bạn có thể đặt tệp cấu hình theo cách thủ công:

SessionFactory sessionFactory = new Configuration().configure("hibernate-dev.cfg.xml").buildSessionFactory();

Phương pháp bốn - chúng tôi sử dụng tệp hibernate.properties tùy chỉnh:

ClassLoader classLoader = Thread.currentThread().getClassLoader();

Properties properties = new Properties();
properties.load(classLoader.getResourceAsStream("hibernate-dev.properties"));

SessionFactory sessionFactory = new Configuration()
            .addProperties(properties)
            .buildSessionFactory();

Và cuối cùng, bạn có thể chỉ cần ghép trực tiếp tất cả các tham số cần thiết vào mã:

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 Chỉ định nơi tìm các lớp Thực thể

Nhưng đó không phải là tất cả. Khi chúng tôi định cấu hình một đối tượng SessionFactory trong Hibernate, SessionFactory này sẽ kiểm tra xem tất cả các bảng cần thiết với các loại cột bắt buộc có tồn tại trong cơ sở dữ liệu hay không.

Và để SessionFactory có thể làm được điều này, nó cần được chuyển một danh sách các lớp thực thể mà nó cần ánh xạ tới cơ sở dữ liệu.

Có ba cách để truyền danh sách các lớp thực thể:

Phương pháp một. Trong hibernate.cfg.xmlthêm một dòng như:

<mapping class="class-qualified-name" />

Ví dụ:

<mapping class="com.codegym.data.User" />
<mapping class="com.codegym.data.Employee" />
<mapping class="com.codegym.data.Task" />

Phương pháp hai. Gọi phương thức trên đối tượng Cấu hìnhaddAnnotatedClass() . Ví dụ:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addAnnotatedClass(com.codegym.data.User.class)
   	.buildSessionFactory();

Nếu có nhiều lớp, thì bạn có thể thêm chúng vào toàn bộ gói:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addPackage("com.codegym.data")
   	.buildSessionFactory();

3.5 Ví dụ cuối cùng

Bây giờ chúng ta đã học cách cấu hình đối tượng SessionFactory, hãy viết mã sẽ sử dụng nó.

Nó sẽ bao gồm ba phương pháp:

  1. Định cấu hình ngủ đông
  2. Phương thức lấy tất cả nhân viên từ cơ sở dữ liệu
  3. Phương pháp lưu một nhân viên mới vào cơ sở dữ liệu

Mẫu mã này sẽ giống như thế này:

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

Trước khi thực hiện truy vấn đến cơ sở dữ liệu, bạn cần tạo một phiên riêng. Nếu các yêu cầu có liên quan với nhau, thì chúng có thể được thực hiện trong cùng một phiên. Nếu các yêu cầu không liên quan (và có thể mất vài phút giữa chúng), thì chúng cần thực hiện các phiên của riêng mình.

Nếu bạn muốn đọc dữ liệu từ cơ sở dữ liệu hoặc thực hiện một truy vấn phức tạp, trước tiên bạn phải tạo một đối tượng Truy vấn và sử dụng nó để thực hiện truy vấn của mình.

Ngoài ra, mỗi truy vấn đến cơ sở dữ liệu được thực hiện trong giao dịch riêng của nó. Bạn cần mở nó, thực hiện các thao tác cần thiết rồi đóng (cam kết).

Trong các bài giảng sau, chúng tôi sẽ phân tích chi tiết hơn về cách thức hoạt động của tất cả những điều này.