Thông qua các property, các thuộc tính trong entity có thể được ánh xạ một cách trực quan vào các cột trong cơ sở dữ liệu. Việc áp dụng đúng các mối quan hệ giúp tối ưu hóa hiệu suất và bảo đảm tính toàn vẹn của dữ liệu khi thực hiện các thao tác với các entity có liên kết.
3. Property trong Entity
3.1 Property Đơn Giản
Các property là các thuộc tính của entity và sẽ được ánh xạ tới các cột trong bảng cơ sở dữ liệu. Các thuộc tính này có thể là các kiểu dữ liệu đơn giản như String, Integer, Double, v.v.
Ví dụ về một entity Product:
Các điều cần lưu ý:
- name và price là các property của Product, sẽ tương ứng với các cột name và price trong bảng Product của cơ sở dữ liệu.
- Kiểu BigDecimal được sử dụng cho giá để đảm bảo tính chính xác trong các phép toán tài chính.
3.2 Property Quan Hệ
Khi có quan hệ giữa các entity, các property có thể là các đối tượng khác thay vì chỉ là các kiểu dữ liệu đơn giản. Những thuộc tính này sẽ ánh xạ tới các bảng khác thông qua các quan hệ.
Ví dụ về entity Customer có quan hệ với Address:
Các điều cần lưu ý:
- address trong Customer là một property quan hệ, nó không phải là một kiểu dữ liệu đơn giản mà là một đối tượng của entity Address.
- Khi lưu trữ entity Customer, JPA sẽ lưu thông tin về địa chỉ thông qua quan hệ một-một với entity Address.
4. Các Tính Năng Khác
4.1 Cascade Operations
Khi bạn thực hiện một hành động trên entity chính, bạn có thể muốn nó tự động áp dụng cho các entity liên quan. Để làm điều này, bạn sử dụng cascade.
Các điều cần lưu ý:
- cascade = CascadeType.ALL: Điều này có nghĩa là mọi thao tác (save, update, delete) trên entity Customer sẽ tự động được áp dụng cho các Order liên quan.
4.2 Fetching Strategy
JPA hỗ trợ các chiến lược fetching để chỉ định khi nào dữ liệu liên quan sẽ được tải. Có hai chiến lược phổ biến: LAZY và EAGER.
Các điều cần lưu ý:
- FetchType.LAZY: Chỉ tải đối tượng customer khi thực sự cần thiết, giúp giảm tải cơ sở dữ liệu.
- FetchType.EAGER: Tải ngay lập tức khi entity chính được truy xuất.
5. Phần bổ sung
5.1. orphanRemoval
OrphanRemoval cho phép tự động xóa các entity con khi chúng không còn được tham chiếu bởi entity cha.
Ví dụ:
Các điều cần lưu ý:
- Khi Order bị xóa khỏi danh sách orders, nó sẽ tự động bị xóa khỏi cơ sở dữ liệu.
5.2. @OrderBy
@OrderBy dùng để sắp xếp danh sách entity con theo một hoặc nhiều thuộc tính.
Ví dụ:
Cần lưu ý điều sau:
- Sắp xếp danh sách orders theo thứ tự tăng dần của createdDate.
5.3. @Where
@Where là một annotation của Hibernate, dùng để áp dụng điều kiện khi truy vấn dữ liệu.
Ví dụ:
Cần lưu ý điều sau:
- Chỉ tải các Order có trạng thái ACTIVE.
5.4. FetchType mặc định trong ManyToOne và OneToMany
- @ManyToOne: Mặc định là EAGER.
- Lý do: Khi tải entity chính, dữ liệu của entity liên quan thường cần thiết ngay lập tức.
- @OneToMany: Mặc định là LAZY.
- Lý do: Dữ liệu liên quan trong mối quan hệ một-nhiều thường rất lớn, nên chỉ tải khi cần để tiết kiệm tài nguyên.
Ví dụ:
Cần lưu ý điều sau:
- FetchType.LAZY: Tải dữ liệu khi được truy cập lần đầu.
- FetchType.EAGER: Tải dữ liệu ngay lập tức khi entity chính được truy xuất.
Thông qua property, các trường dữ liệu trong entity có thể được ánh xạ một cách dễ dàng vào các cột trong cơ sở dữ liệu. Việc áp dụng các quan hệ đúng cách giúp tối ưu hóa hiệu suất và duy trì tính toàn vẹn của dữ liệu khi thao tác với các entity liên kết nhau.
Các tính năng như cascade và fetching strategy giúp bạn kiểm soát các hành động trên các entity liên quan và quyết định cách thức tải dữ liệu, từ đó nâng cao khả năng kiểm soát trong quá trình làm việc với cơ sở dữ liệu.
Các tính năng bổ sung như orphanRemoval, @OrderBy, @Where, và chiến lược fetch giúp nâng cao tính linh hoạt và hiệu quả trong xử lý dữ liệu.
--------------------------------------------------------------------------------------------
Để khám phá thêm kiến thức về công nghệ và phát triển phần mềm, đừng ngần ngại liên hệ với chúng tôi qua các phương thức bên dưới. Sucodev Community luôn sẵn sàng đồng hành cùng bạn!
Fanpage: https://www.facebook.com/Sucodev.Community
Group Zalo: https://zalo.me/g/bxdjch748