2011-11-25 35 views
14

Tôi đã gặp phải ví dụ này trong Đặc tả kỹ thuật FR JPA 2.0, 11.1.37. OneToOne chú thích, trang 403:@OneToOne (tùy chọn = false) và @JoinColumn (nullable = false) được sử dụng cùng nhau

@OneToOne(optional=false) 
@JoinColumn(name="CUSTREC_ID", unique=true, nullable=false, updatable=false) 
public CustomerRecord getCustomerRecord() { return customerRecord; } 

Có bất kỳ lý do mà tôi nên đặt @OneToOne(optional=false) và lúc đó thời đưa @JoinColumn(... nullable=false)?

Không phải hai khai báo này giống nhau không? Không phải là một trong số họ dư thừa?
Cả hai đều được sử dụng trong tạo lược đồ DDL?

Trả lời

26

Chính thức optional=false là hướng dẫn thời gian chạy để triển khai JPA và nullable=false là hướng dẫn cho trình tạo DDL. Vì vậy, họ không phải là hoàn toàn thừa.

Sự khác biệt có thể trở nên quan trọng khi có sự thừa kế thực thể liên quan. Nếu một ánh xạ cụ thể chỉ tồn tại trên một lớp con và bạn có một bảng chiến lược theo từng cấp phân cấp bảng, thì ánh xạ OneToOne có thể là optional=false trên lớp con cụ thể có chứa ánh xạ. Tuy nhiên, cột kết nối thực tế không thể được thực hiện không-null, vì sau đó các lớp con khác chia sẻ bảng không thể được chèn vào!

Trong thực tế, các phiên bản khác nhau của các nhà cung cấp khác nhau có thể hoặc không thể giải thích một trong hai thời điểm đó, hãy để trống ô trống.

+4

Có nghĩa vụ phải trả lời rõ ràng như vậy! –

Các vấn đề liên quan