@Basic (tùy chọn = false) so với @Column (nullable = false) trong JPA


103

Sự khác biệt giữa @Basic(optional = false)@Column(nullable = false)trong JPA dai dẳng là gì?



14
Không hẳn là một bản sao, câu hỏi là nhiều hơn về các thuộc tính, không phải các chú thích.
Pascal Thivent

Có thể nó sẽ giúp được nhiều hơn stackoverflow.com/a/59497054/6191407
Sonu patel

Câu trả lời:


98

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 optionalnullablelà 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 optionalthì 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.


8
Vì vậy, cái nào thực sự nên được sử dụng, có thể là cả hai?
Xiè Jìléi

39
@Xie Jilei: Từ sách: Sự bền bỉ của Java với chế độ ngủ đông 2007, tr. 179: @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.
rapt

2
@rapt - Tôi không hiểu 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ỉ @Basicgiống như nói rằng làm cho cột cơ sở dữ liệu NOT NULLcho biến đã nói?
Erran Morad

9
Nó có nghĩa là, nếu bạn cố gắng duy trì một thực thể có trường null, nó sẽ ném ra một ngoại lệ nếu nó được đánh dấu là tùy chọn = false (không liên hệ với cơ sở dữ liệu) và thực thể sẽ không được thêm vào ngữ cảnh tồn tại JPA. Nếu nó chỉ được chú thích là nullable = false thì thực thể sẽ được thêm vào ngữ cảnh tồn tại và khi cố gắng ghi thực thể vào cơ sở dữ liệu (ví dụ qua flush), nó sẽ cố gắng ghi thực thể vào cơ sở dữ liệu, điều này sẽ từ chối điều này và nó sẽ ném ra một ngoại lệ sau đó.
Ray Hulha

@RayHulha Tôi đã cố gắng chú thích một trường bằng "@Basic (tùy chọn = false)" và tôi đã thêm một bộ tuple vào cơ sở dữ liệu (với giá trị của trường này = null), không có ngoại lệ nào được nêu ra !!, Tôi hy vọng bạn có thể giải thích đối với tôi hành vi này.
ziMtyth

4

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.)


1
Thật buồn cười khi câu trả lời khác ngụ ý rằng đó là nullable chứ không phải Basic được sử dụng để tạo giản đồ (khi nó nói rằng «'nullable' chỉ tham chiếu đến các cột cơ sở dữ liệu»). Nó vẫn còn rất khó hiểu. Tôi đoán nullable được sử dụng để tạo lược đồ và Basic (tùy chọn = false) có thể được sử dụng cho cùng mục đích? Điều đó có ý nghĩa?
marcus

optional = falsechỉ để kiểm tra ràng buộc này trong thời gian chạy. nullable = falsetạo ràng buộc cơ sở dữ liệu. Đối với các ứng dụng, việc đặt cũng optional = falsecó ý 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 đó ở đó ..
nimo23
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.