1.1 Ánh xạ các lớp vào bảng

Sau khi học JDBC, rất có thể bạn sẽ có ấn tượng rằng làm việc với cơ sở dữ liệu từ một ứng dụng Java vẫn là một thú vui. Điều gì sẽ xảy ra nếu tôi nói với bạn rằng tất cả công việc này có thể được thực hiện dễ dàng hơn gấp 10 lần?

Ưu điểm chính của ngôn ngữ SQL là gì? Đây là một ngôn ngữ khai báo - nó mô tả những gì chúng tôi muốn nhận và không nói gì về cách thực hiện. Làm thế nào - đây là mối quan tâm của máy chủ SQL.

Cách tiếp cận tương tự có thể được sử dụng khi làm việc với cơ sở dữ liệu.

Trong một thế giới lý tưởng, chúng ta có thể chỉ cần viết các truy vấn SQL vào cơ sở dữ liệu và để đáp lại, chúng ta sẽ nhận được các đối tượng Java hoặc bộ sưu tập các đối tượng Java được tạo sẵn nếu chúng ta yêu cầu một số phần.

Tôi có thể nói gì đây, đây là điều mà một số người đã nghĩ vào năm 2000 và quyết định viết khung ORM của riêng họ.

ORM là viết tắt của Object-Relational Mapping và về cơ bản là ánh xạ các đối tượng Java tới các truy vấn SQL.

Các chàng trai đã nghĩ ra một điều rất đơn giản - mỗi bảng trong cơ sở dữ liệu phải tương ứng với một số lớp trong ứng dụng Java . Trong một ứng dụng Java, chúng ta thao tác với các đối tượng và các đối tượng này đã biết cách tự lưu vào cơ sở dữ liệu.

Có ba cách tiếp cận để giải quyết vấn đề này và chúng trông giống như thế này:

  1. Đối tượng tự lưu vào cơ sở dữ liệu và cập nhật các trường của nó dựa trên thông tin từ cơ sở dữ liệu.
  2. Đối tượng có thể tự lưu vào cơ sở dữ liệu, nhưng không bao giờ khởi tạo trường hợp này.
  3. Đối tượng chỉ chứa dữ liệu và ai đó lưu nó vào cơ sở dữ liệu và tải nó từ cơ sở dữ liệu.

Ban đầu, cách tiếp cận đầu tiên chiếm ưu thế, sau đó Máy chủ ứng dụng và Enterprise Java Beans trở nên phổ biến. Thậm chí còn có cả một lớp đậu được gọi là EJB bền bỉ có thể tự lưu vào cơ sở dữ liệu.

Nhưng đến một ngày mọi thứ thay đổi...

1.2 Sự xuất hiện của Hibernate

Năm 2001, phiên bản đầu tiên của Hibernate framework được phát hành. Đó là một khung rất đơn giản, nhưng nó cho phép sử dụng các "đối tượng ngu ngốc" thông thường không biết gì về cách chúng được lưu trữ trong cơ sở dữ liệu hoặc được tải từ đó.

Ánh xạ các trường của các lớp Java và các cột trong một bảng trong cơ sở dữ liệu được thiết lập bằng tệp XML. Và đôi khi chúng khá cồng kềnh. Được rồi, tôi đang đùa ai vậy. Chúng là những bức tranh khổng lồ chứa mã XML. Và tình hình chỉ được cứu vãn bởi thực tế là 20 năm trước không có cơ sở dữ liệu khổng lồ như bây giờ.

Nhưng trên thực tế, quyết định mạnh mẽ nhất cuối cùng là tách đối tượng cần được lưu vào cơ sở dữ liệu khỏi mã đã lưu nó ở đó . Giải pháp này không thực sự rõ ràng. Bởi vì nguyên tắc đóng gói nói rằng đối tượng biết rõ nhất về cách nó cần được lưu và tải.

Và cách tiếp cận ORM thực sự phá vỡ khái niệm đó. Lớp dữ liệu phơi bày cấu trúc bên trong của nó, nhưng nó đã trở nên dễ vận hành hơn nhiều với các nhóm đối tượng thuộc các kiểu khác nhau.

Một bước đột phá lớn đã xảy ra sau khi phát hành Java 5 , khi có hai điều xuất hiện trong JDK:

  • Chú thích
  • Ủy quyền

Chú thíchXML đã nhanh chóng được thay thế và giờ đây thật dễ dàng để chỉ định tất cả các cài đặt cần thiết để ánh xạ một lớp Java tới một bảng trong cơ sở dữ liệu ngay trong lớp Java.

Ủy quyềnkhông quá đáng chú ý đối với người dùng Hibernate, nhưng đóng góp của họ thậm chí còn nghiêm trọng hơn. Khi bạn yêu cầu một hoặc nhiều đối tượng cụ thể từ Hibernate, nó chỉ trả về cho bạn một sơ khai (proxy) và chặn tất cả các cuộc gọi đến các phương thức của nó.

Điều này cho phép triển khai nhiều cơ chế Tải chậm khác nhau và nâng tốc độ cũng như hiệu quả của Hibernate lên mức hoàn toàn cao ngất trời vào thời điểm đó. Hibernate không chỉ trở thành một tiêu chuẩn công nghiệp trên thực tế - nó đã bắt đầu được dịch sang các ngôn ngữ khác. Vì vậy, ví dụ, Framework NHibernate đã xuất hiện cho C#.

1.3 Sự xuất hiện của JPA

De facto theo sau là sự công nhận de jure. Các nhà phát triển JDK đã quyết định tạo ra một đặc tả về cách ánh xạ chính xác các đối tượng vào các bảng trong cơ sở dữ liệu. Thông số kỹ thuật này được gọi làNhật Bản- API bền vững Java.

Đây chính xác là đặc điểm kỹ thuật. Nó mô tả mọi thứ sẽ hoạt động như thế nào và chúng ta cần chú thích gì để đánh dấu các phần khác nhau của lớp nếu chúng ta muốn các đối tượng của nó được lưu vào cơ sở dữ liệu.

Có vẻ như các chàng trai chỉ lấy Hibernate làm cơ sở và thay đổi tên gói từ nó. Bởi vì tất cả các chú thích trong Hibernate đã chuyển gần như từng cái một sang JPA.

Ngày nay, Hibernate triển khai đầy đủ toàn bộ đặc tả JPA, cũng như một số tính năng bổ sung giúp làm việc với nó thậm chí còn thoải mái hơn. Do đó, về mặt tiêu chuẩn hóa, chúng ta có thể nói rằng Hibernate có hai bộ tính năng:

  • tiêu chuẩn JPA
  • Hibernate Native API (chức năng bổ sung)

Tài liệu Hibernate chính thức mô tả nó như thế này:

Nhưng cả dựa trên kinh nghiệm của tôi và sau khi đọc lại tài liệu về Hibernate, tôi có thể nói rằng API JPA và Hibernate giống nhau đến 95%. Chúng chỉ là những khái niệm giống hệt nhau.

1.4 Maven cho ngủ đông

Vì tôi đã ca ngợi Hibernate rất nhiều, nên tôi nghĩ đã đến lúc chuyển sang làm việc với nó chăm chỉ hơn một chút.

Thứ nhất, có một trang web chính thức, nơi chỉ có một loạt các tài liệu bằng tiếng Anh. Tất nhiên, cô ấy thiên vị về thông tin tham khảo chứ không phải về đào tạo. Nhưng nó vẫn tốt hơn là gỡ lỗi các nguồn, phải không? :)

Chỉ dẫn:

  1. Bạn mở liên kết .
  2. Bạn nhìn cô ấy thật lâu.
  3. Trở lại với CodeGym.
  4. Bạn đọc các bài giảng tiếp theo của tôi.

Công việc của tôi là đơn giản hóa những điều phức tạp và giải thích chúng bằng những thuật ngữ đơn giản. Và nếu bạn đã đạt đến cấp độ này, thì tôi có thể làm được.

Chà, để bắt đầu với Hibernate, bạn cần thêm nó vào tệp pom.xml của mình. Cho đến nay, phiên bản thứ 6 của Hibernate đã có sẵn, hay đúng hơn là 6.1.1, vì vậy chúng ta sẽ tìm hiểu cách làm việc với phiên bản mới nhất.

Chỉ cần thêm những dòng này vào tệp pom.xml của bạn:


<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

Nếu bạn đang đọc bài giảng này ngoài cửa sổ 2023+, thì bạn có thể tải xuống phiên bản mới tại đây .

Quan trọng! Một số thư viện mà Hibernate sử dụng đã không được dùng nữa trong JDK 11 và JDK 17, vì vậy nếu bạn gặp sự cố khi khởi động và chạy dự án của mình, hãy thêm các phụ thuộc sau vào đó:


  	<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
  	</dependency>