Mục lục
Thoạt nhìn có vẻ như cách sử dụng @Size, @Length, và @Column(length=value) đều như sau. Đây là một thiếu xót khá nghiêm trọng mà nhiều bạn mắc phải trong giai đoạn làm quen với JPA – Hibernate.
Trong bài viết ngắn này chúng ta sẽ cùng nhau làm rõ vấn đề này, để chúng ta có thể áp dụng chúng một cách đúng đắn và mang lại hiệu quả cho dự án.
Điểm khác nhau giữa @Size, @Length và @Column(length=value)
Trước hết, những annotation này đều có chung một đặc điểm là mô tả độ dài của một thuộc tính. Thế nhưng mỗi thứ trong chúng đều có một ý nghĩa khác nhau.
@Size và @Length có mục đích sử dụng giống nhau, chúng được dùng để chỉ quy định độ dài của các thuộc tính. Nếu một thuộc tính có độ dài vượt quá khoảng cho phép mà @Size và @Length định nghĩa thì Hibernate sẽ quăng exception. Điểm khác biệt nhỏ giữa chúng là @Size là một annotation được JPA định nghĩa trong khi @Length được Hibernate định nghĩa.
@Column annotation là một trong những JPA annotation dùng để định nghĩa một entity tương ứng với một table trong database, chúng ta sẽ tìm hiểu rõ hơn ở phần sau.
@Size
Để quy định khoảng độ dài của thuộc tính, chúng ta có thể sử dụng @Size annotation để quy định chúng. Lấy ví dụ thuộc tính middleName trong User entity được quy định độ dài từ khoảng min đến max.
public class User { // ... @Size(min = 3, max = 15) private String middleName; // ... }
Điểm quan trọng ở đây là @Size annotation là một annotation của JPA nên nó có thể sử dụng độc lập với các JPA provider chứ không riêng gì Hibernate.
@Length
Tương tự, @Length cũng có cách sử dụng như @Size, nưng nó là một annotation của riêng Hibernate cung cấp, nó chỉ sử dụng được khi chúng ta sử dụng JPA và Hibernate là một JPA provider hay chỉ sử dụng Hibernate riêng lẽ.
@Entity public class User { // ... @Length(min = 3, max = 15) private String lastName; // ...
@Column (length=value)
@Column khác hẳn về ý nghĩa và cách sử dụng so với @Size và @Length, nó dùng để chỉ định số lượng ký tự có thể chứa của một cột trong database. Không dùng để quy định độ dài của một cột.
Giả sử nếu chúng ta ánh xạ User entity như sau:
@Entity public class User { @Column(length = 3) private String firstName; // ... }
Thì kết quả dưới database chúng ta sẽ có cột firstName được khai báo tương ứng VARCHAR(3). Nếu cố gắng thêm một dòng dữ liệu có độ dài của firstName lớn hơn 3 thì chúng ta sẽ nhận lại một SQL Error.
Cuối cùng, chúng ta hoàn toàn có thể sử dụng @Column và @Size hoặc @Length chung với nhau để chỉ định độ dài và cơ chế kiểm tra dữ liệu.
@Entity public class User { // ... @Column(length = 5) @Size(min = 3, max = 5) private String city; // ... }
Tóm lược
Qua bài viết trên chúng ta đã tìm hiểu được điểm khác nhau và cách sử dụng của @Size, @Length và @Column(length=value). Nếu dự án của bạn đang sử dụng JPA thì nên sử dụng @Size hơn là @Length, vì @Length chỉ sử dụng được khi Hibernate là một JPA Provider. Nếu tương lai chúng ta chuyển qua một JPA Provider khác thì code chỗ này sẽ gây lỗi cho hệ thống.
Nguồn tham khảo