Sự khác biệt giữa @Basic(optional = false)
và @Column(nullable = false)
trong JPA dai dẳng là gì?
Sự khác biệt giữa @Basic(optional = false)
và @Column(nullable = false)
trong JPA dai dẳng là gì?
Câu trả lời:
Gordon Yorke (Thành viên Ủy ban Kiến trúc EclipseLink, Trưởng nhóm Kỹ thuật cốt lõi TopLink, Thành viên Nhóm Chuyên gia JPA 2.0) đã viết một câu trả lời hay về chủ đề này, vì vậy thay vì diễn giải anh ta, tôi sẽ trích dẫn câu trả lời của anh ta :
Sự khác biệt giữa
optional
vànullable
là phạm vi mà chúng được đánh giá. Định nghĩa của 'optional
' nói về các giá trị thuộc tính và trường và gợi ý rằng tính năng này nên được đánh giá trong thời gian chạy. 'nullable
' chỉ tham chiếu đến các cột cơ sở dữ liệu.Nếu một triển khai chọn thực hiện
optional
thì các thuộc tính đó sẽ được đánh giá trong bộ nhớ bởi Nhà cung cấp bền vững và một ngoại lệ được nêu ra trước khi SQL được gửi đến cơ sở dữ liệu, nếu không thì khi sử dụng 'updatable=false
' 'optional
' vi phạm sẽ không bao giờ được báo cáo.
@Basic(optional = false) @Column(nullable = false)
Chú thích @Basic đánh dấu thuộc tính không phải là tùy chọn ở cấp đối tượng Java. Thiết đặt thứ hai, nullable = false trên ánh xạ cột, chỉ chịu trách nhiệm tạo ra ràng buộc cơ sở dữ liệu KHÔNG ĐẦY ĐỦ. Việc triển khai Hibernate JPA xử lý cả hai tùy chọn theo cách giống nhau trong mọi trường hợp, vì vậy bạn cũng có thể chỉ sử dụng một trong các chú thích cho mục đích này.
The @Basic annotation marks the property as not optional on the Java object level.
Điều đó có nghĩa là gì? Vì vậy, chỉ @Basic
giống như nói rằng làm cho cột cơ sở dữ liệu NOT NULL
cho biến đã nói?
Vì vậy, tôi đã thử chú thích @Basic (tùy chọn = false) bằng JPA 2.1 (EclipseLink) và hóa ra chú thích bị bỏ qua trong cách sử dụng thực tế (ít nhất là đối với trường Chuỗi). (ví dụ: cuộc gọi entityManager.persist).
Vì vậy, tôi đã đi đến đặc điểm kỹ thuật và đọc về nó. Đây là những gì thông số kỹ thuật phải nói:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
Cơ bản (tùy chọn): Cho dù giá trị của trường hoặc thuộc tính có thể rỗng. Đây là một gợi ý và được bỏ qua cho các loại nguyên thủy; nó có thể được sử dụng trong tạo lược đồ.
Vì vậy, tôi nghĩ câu này giải thích trường hợp sử dụng thực cho Basic (tùy chọn) nó được sử dụng trong tạo lược đồ. (Đó là: khi bạn tạo SQL CREATE TABLE từ các lớp Java Entity. Đây là điều mà Hibernate có thể làm chẳng hạn.)
optional = false
chỉ để kiểm tra ràng buộc này trong thời gian chạy. nullable = false
tạo ràng buộc cơ sở dữ liệu. Đối với các ứng dụng, việc đặt cũng optional = false
có ý nghĩa, vì nó được đánh giá nhanh hơn so với việc truy cập cơ sở dữ liệu và kiểm tra ràng buộc đó ở đó ..