Các thủ thuật trong Hibernate mà ngay cả các Java Developer cũng chưa biết

Tram Ho

Mở đầu

Hibernate là một thư viện ORM (Object Relational Mapping) mã nguồn mở giúp lập trình viên viết ứng dụng Java có thể map các objects (pojo) với hệ quản trị cơ sở dữ liệu quan hệ, và hỗ trợ thực hiện các khái niệm lập trình hướng đối tượng với cớ dữ liệu quan hệ.
Hiểu ngắn gọn thì Hibernate sẽ là một layer đứng trung gian giữa ứng dụng và database, và chúng ta sẽ giao tiếp với Hibernate thay vì giao tiếp với database .
Bài viết này sẽ không không trình bày các cấu hình về hibernate nhưng sẽ chỉ ra các công dụng của hibernate mà chính các Java Developer cũng chưa biết

Nội dung

Sử UUID như một primary key trong Hibernate

Vấn đề : Bạn muốn dùng UUID như một primary key trong database .

Giải pháp:

Hibernate hỗ trợ rất tốt cho các thuộc tính của loại java.util.UUID nhằm sử dụng UUID làm khóa chính và cung cấp hai trình tạo để tạo UUID. Hibernate hỗ 2 loại chính IETF RFC 4122 version 4 và IETF RFC 4122 version 1 . Ở đây mình chỉ giới thiệu tạo theo tiêu chuẩn RFC 4122 version 4

ETF RFC 4122 version 4 .

Để có thể tạo UUDI, chúng ta chỉ cần thêm chú thích @GeneratedValue vào thuộc tính khóa chính java.util.UUID. Ví dụ

Khi thực hiện lưu đối tượng vào databae, UUID sẽ được tạo trước khi đối tượng được lưu vào database

Map enum sang database column

Vấn đề : Bạn muốn map thuộc tính enum sang cột trong database.

Giải pháp:
JPA và Hibernate cung cấp hai tùy chọn tiêu chuẩn để ánh xạ enum vào cơ sở dữ liệu
cột. Bạn có thể sử dụng Enum dưới dạng String hoặc theo thứ tự

  • Đối với Enum dưới dạng String, đổi tên một giá trị enum yêu cầu
    chúng ta sẽ phải cũng cập nhật cơ sở dữ liệu
  • Đối với kiểu ordinal : Thứ tự của một giá trị enum phụ thuộc vị trí của nó trong khai báo enum. Bạn sẽ phải cập nhật cơ sở dữ liệu của mình khi xóa giá trị hiện có hoặc thay đổi vị trí các giá trị trong enum
    Khi thực hiện ánh xạ, Hibernate và JPA hỗ trợ một chú thích để bạn có thể xác định kiểu ánh xạ với chú thích @Enumerated

Ví dụ: một enum cơ bản với Enum tên là AuthorStatus

.
Ví dụ phía dưới, sử dụng chú thích @Enumerated với kiểu ordinal. Nếu mặc định không khai báo chú thích @Enumerated hoặc không xác định kiểu chú thích EnumType , Hibernate mặc định sẽ sử dụng ordinal làm default mapping

Khi thực hiện lưu Author vào database với status PUBLISHED, Hibernate sẽ lưu giá trị 0 vào database

Nếu sử dụng kiểu** STRING**, chúng ta cần khai báo chú thích @Enumerated và xác định kiểu ánh xạ là EnumType.STRING

Khi thực hiện lưu Author vào database với status PUBLISHED, Hibernate sẽ lưu giá trị PUBLISHED vào database ở cột status

Tự động thiết lập một attribute trước khi lưu

Problem : Bạn muốn tự động thiết lập một attribute trước khi nó được lưu vào database: Ví dụ thời gian, tính toán một giá trị …
Giải pháp: : Bạn có thể sử dụng chú thích @PrePersist tự động thiết lập một giá trị trước khi nó được lưu vào database

Hibernate sẽ gọi phương thức này trước khi nó lưu Author vào database.

Hibernate gọi phương thức initizeCreatedAt trước khi nó chọn giá trị khóa chính từ cơ sở dữ liệu. Sau đó, nó sẽ lưu giá trị createdAt vào cơ sở dữ liệu.

Tính toán thuộc tính của đối tượng với chú thích @Formula trong hibernate

Vấn đề : Giá trị của một trong các thuộc tính của entity cần được tính bằng SQL
expression. Và bạn muốn map nó với hibernate.

Giải pháp : Có thể sử dụng chú thích @Formula để khai báo giá trị trong SQL snippet . Hibernate sẽ thực thi nó khi thực hiện truy vấn từ cơ sở dữ liệu.

Ví dụ sau đây sử dụng chú thích @Formula để tính toán ages của Author

Khi Hibernate tìm nạp Entity Author từ cơ sở dữ liệu, nó sẽ thêm SQL đoạn trích của chú thích @Formula cho câu lệnh SQL của nó.

Truy vấn kết quả query dưới dạng Stream trong Java 8

Problem : Bạn muốn sử dụng Java 8 Stream để truy cập kết quả
Giải pháp :
Đối với phiên bản Hibernate 5.2 , chúng ta có thể làm được điều đó bằng cách sử dụng : Hibernate’s Query interface. Nó trả về kết quả query dưới dạng Stream và sử dụng
HibernateScrollableResults để truy cập kết quả.
Ví dụ :

Kết luận

Bài viết trên chỉ là một phần nhỏ trong các thủ thuật để bạn có thể làm việc hiệu quả hơn với Hibernate. Còn rất nhiều thủ thuật mình chưa kịp đề cập ở bài viết này. Hẹn gặp lại trong các bài viết kế tiếp

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo