Trước hết, một số giải thích cho câu trả lời của KLE :
Liên kết một-một không bị ràng buộc (không thể bị ràng buộc) là liên kết duy nhất không thể được ủy quyền nếu không có công cụ mã byte. Lý do cho điều này là vì thực thể chủ sở hữu PHẢI biết liệu thuộc tính kết hợp nên chứa đối tượng proxy hay NULL và nó không thể xác định rằng bằng cách xem các cột của bảng cơ sở do một-một thường được ánh xạ thông qua PK được chia sẻ, vì vậy nó dù sao cũng phải háo hức tìm kiếm proxy. Đây là một lời giải thích chi tiết hơn .
các hiệp hội nhiều-một (và một-nhiều, rõ ràng) không gặp phải vấn đề này. Chủ thể chủ sở hữu có thể dễ dàng kiểm tra FK của chính mình (và trong trường hợp một-nhiều, proxy bộ sưu tập trống được tạo ban đầu và được điền theo yêu cầu), vì vậy hiệp hội có thể lười biếng.
Thay thế một-một bằng một-nhiều là khá nhiều không bao giờ là một ý tưởng tốt. Bạn có thể thay thế nó bằng nhiều tính năng độc nhất nhưng có các tùy chọn khác (có thể tốt hơn).
Rob H. có một điểm hợp lệ, tuy nhiên bạn có thể không thực hiện được tùy thuộc vào mô hình của mình (ví dụ: nếu liên kết một-một của bạn là null).
Bây giờ, theo như câu hỏi ban đầu:
A) @ManyToOne(fetch=FetchType.LAZY)
nên hoạt động tốt. Bạn có chắc chắn rằng nó không bị ghi đè trong chính truy vấn không? Có thể chỉ định join fetch
trong HQL và / hoặc đặt rõ ràng chế độ tìm nạp thông qua API Tiêu chí sẽ được ưu tiên hơn chú thích lớp. Nếu đó không phải là trường hợp và bạn vẫn gặp sự cố, vui lòng đăng các lớp, truy vấn và kết quả SQL của bạn để trò chuyện nhiều hơn.
B) @OneToOne
là khó khăn hơn. Nếu nó chắc chắn không thể rỗng, hãy đi với đề xuất của Rob H. và chỉ định nó như sau:
@OneToOne(optional = false, fetch = FetchType.LAZY)
Mặt khác, nếu bạn có thể thay đổi cơ sở dữ liệu của mình (thêm cột khóa ngoại vào bảng chủ sở hữu), hãy làm như vậy và ánh xạ nó thành "đã tham gia":
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
và trong OtherEntity:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
Nếu bạn không thể làm điều đó (và không thể sống với tìm nạp háo hức) thì thiết bị mã byte là lựa chọn duy nhất của bạn. Tôi phải đồng ý với CPerkins , tuy nhiên - nếu bạn có 80 !!! tham gia do các hiệp hội OneToOne háo hức, bạn đã gặp vấn đề lớn hơn sau đó :-)
one-to-one
một công thức như thế nàoselect other_entity.id from other_entity where id = other_entity.id
. Tất nhiên, điều này không lý tưởng cho các màn trình diễn truy vấn.