Trong hướng dẫn nhanh này, chúng tôi sẽ chỉ ra sự khác biệt và chỉ ra cách chúng tôi có thể sử dụng chúng trong Hibernate
2. Phụ thuộc Maven
Để sử dụng Hibernate, trước tiên hãy xác định phần phụ thuộc chính trong tệp pom của chúng tôi. xml
org.hibernate
hibernate-core
5.2.2.Final
Phiên bản mới nhất của Hibernate có thể được tìm thấy tại đây
3. Háo hức và lười tải
Điều đầu tiên mà chúng ta nên thảo luận ở đây là tải chậm và tải háo hức là gì
- Eager Loading là một mẫu thiết kế trong đó việc khởi tạo dữ liệu xảy ra ngay tại chỗ
- Lazy Loading là một mẫu thiết kế mà chúng tôi sử dụng để trì hoãn việc khởi tạo một đối tượng miễn là có thể
Hãy xem cách nó hoạt động
Đầu tiên, chúng ta sẽ xem lớp UserLazy
@Entity
@Table[name = "USER"]
public class UserLazy implements Serializable {
@Id
@GeneratedValue
@Column[name = "USER_ID"]
private Long userId;
@OneToMany[fetch = FetchType.LAZY, mappedBy = "user"]
private Set orderDetail = new HashSet[];
// standard setters and getters
// also override equals and hashcode
}
Tiếp theo, chúng ta sẽ thấy lớp OrderDetail
@Entity
@Table [name = "USER_ORDER"]
public class OrderDetail implements Serializable {
@Id
@GeneratedValue
@Column[name="ORDER_ID"]
private Long orderId;
@ManyToOne[fetch = FetchType.LAZY]
@JoinColumn[name="USER_ID"]
private UserLazy user;
// standard setters and getters
// also override equals and hashcode
}
Một Người dùng có thể có nhiều Chi tiết Đơn hàng. Trong chiến lược tải háo hức, nếu chúng tôi tải dữ liệu Người dùng, nó cũng sẽ tải lên tất cả các đơn đặt hàng được liên kết với nó và sẽ lưu trữ nó trong bộ nhớ
Nhưng khi chúng tôi kích hoạt tải chậm, nếu chúng tôi kéo UserLazy lên, dữ liệu OrderDetail sẽ không được khởi tạo và tải vào bộ nhớ cho đến khi chúng tôi thực hiện lệnh gọi rõ ràng tới nó
Trong phần tiếp theo, chúng ta sẽ xem cách chúng ta triển khai ví dụ trong Hibernate
4. Đang tải cấu hình
Hãy xem cách định cấu hình các chiến lược tìm nạp trong Hibernate
Chúng tôi có thể bật Lazy Loading bằng cách sử dụng tham số chú thích này
fetch = FetchType.LAZY
Đối với Tìm nạp háo hức, chúng tôi sử dụng tham số này
fetch = FetchType.EAGER
Để thiết lập Eager Loading, chúng tôi đã sử dụng lớp song sinh của UserLazy có tên là UserEager
Trong phần tiếp theo, chúng ta sẽ xem xét sự khác biệt giữa hai loại tìm nạp
5. sự khác biệt
Như chúng tôi đã đề cập, sự khác biệt chính giữa hai loại tìm nạp là thời điểm dữ liệu được tải vào bộ nhớ
Chúng ta hãy có một cái nhìn
List users = sessionLazy.createQuery["From UserLazy"].list[];
UserLazy userLazyLoaded = users.get[3];
return [userLazyLoaded.getOrderDetail[]];
Với phương pháp khởi tạo lười biếng, orderDetailSet sẽ chỉ được khởi tạo khi chúng ta gọi nó một cách rõ ràng, sử dụng phương thức getter hoặc một số phương thức khác
UserLazy userLazyLoaded = users.get[3];
Nhưng với cách tiếp cận háo hức trong UserEager, nó sẽ được khởi tạo ngay ở dòng đầu tiên
List user = sessionEager.createQuery["From UserEager"].list[];
Để tải từng phần, chúng tôi sử dụng một đối tượng proxy và kích hoạt một truy vấn SQL riêng để tải orderDetailSet
Ý tưởng vô hiệu hóa proxy hoặc tải chậm được coi là một cách làm không tốt trong Hibernate. Nó có thể dẫn đến việc tìm nạp và lưu trữ rất nhiều dữ liệu, bất kể nhu cầu về nó
Chúng ta có thể sử dụng phương pháp sau để kiểm tra chức năng
________số 8Bây giờ chúng ta hãy xem các truy vấn được tạo trong cả hai trường hợp
true
Cài đặt trên trong tìm nạp. hbm. xml hiển thị các truy vấn SQL được tạo. Nếu chúng ta nhìn vào đầu ra của bảng điều khiển, chúng ta có thể thấy các truy vấn được tạo
Đối với Lazy Loading, đây là truy vấn được tạo để tải dữ liệu Người dùng
@Entity
@Table[name = "USER"]
public class UserLazy implements Serializable {
@Id
@GeneratedValue
@Column[name = "USER_ID"]
private Long userId;
@OneToMany[fetch = FetchType.LAZY, mappedBy = "user"]
private Set orderDetail = new HashSet[];
// standard setters and getters
// also override equals and hashcode
}
0Tuy nhiên, trong quá trình tải háo hức, chúng tôi đã thấy một liên kết được thực hiện với USER_ORDER
@Entity
@Table[name = "USER"]
public class UserLazy implements Serializable {
@Id
@GeneratedValue
@Column[name = "USER_ID"]
private Long userId;
@OneToMany[fetch = FetchType.LAZY, mappedBy = "user"]
private Set orderDetail = new HashSet[];
// standard setters and getters
// also override equals and hashcode
}
1Truy vấn trên được tạo cho tất cả Người dùng, dẫn đến việc sử dụng bộ nhớ nhiều hơn so với cách tiếp cận khác
6. Ưu điểm và nhược điểm
6. 1. tải chậm
Thuận lợi
- Thời gian tải ban đầu nhỏ hơn nhiều so với cách tiếp cận khác
- Tiêu thụ bộ nhớ ít hơn so với cách tiếp cận khác
Nhược điểm
- Khởi tạo bị trì hoãn có thể ảnh hưởng đến hiệu suất trong những thời điểm không mong muốn
- Trong một số trường hợp, chúng ta cần đặc biệt cẩn thận khi xử lý các đối tượng được khởi tạo một cách lười biếng, nếu không chúng ta có thể gặp phải một ngoại lệ
6. 2. háo hức tải
Thuận lợi
- Không có tác động hiệu suất liên quan đến khởi tạo bị trì hoãn
Nhược điểm
- Thời gian tải ban đầu dài
- Tải quá nhiều dữ liệu không cần thiết có thể ảnh hưởng đến hiệu suất
7. Lazy Loading trong Hibernate
Hibernate áp dụng phương pháp tải lười biếng trên các thực thể và liên kết bằng cách cung cấp triển khai proxy cho các lớp
Hibernate chặn các cuộc gọi đến một thực thể bằng cách thay thế nó bằng một proxy bắt nguồn từ lớp của một thực thể. Trong ví dụ của chúng tôi, thông tin được yêu cầu bị thiếu sẽ được tải từ cơ sở dữ liệu trước khi quyền kiểm soát được chuyển sang triển khai lớp Người dùng
Chúng ta cũng nên lưu ý rằng khi liên kết được biểu diễn dưới dạng một lớp tập hợp [trong các ví dụ trên, nó được biểu diễn dưới dạng Set orderDetailSet], một trình bao bọc được tạo và thay thế cho một tập hợp ban đầu