2015-01-09 17 views
10

Tôi có 2 bảng: Order [OrderId(PK), OrderShipmentCode, ...]Shipment[ShipmentId(PK), ShipmentCode, ...].Hibernate: @ManyToOne (fetch = FetchType.LAZY) không hoạt động trên cột được tham chiếu khóa không chính

Trong Order lớp, tôi tuyên bố shipment lĩnh vực như sau:

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "OrderShipmentCode", referencedColumnName = "ShipmentCode", insertable = false, updatable = false, nullable = false) 
private Shipment shipment; 

Khi tôi nhận được danh sách các Order, các Shipment cũng được nạp (Tôi thấy nhiều truy vấn SELECT riêng biệt). Nhưng tôi muốn các Shipment được tải lười biếng, không được lấy cùng với Order.

Đối với các bảng khác, nếu cột được tham chiếu là khóa chính thì kết quả như mong đợi (Tải trọng lười được sử dụng). Trong trường hợp của tôi, ShipmentCode không phải là khóa chính của bảng Shipment và tải chậm không được Hibernate sử dụng.

Bạn có thể chỉ cho tôi cách hoàn thành mục tiêu đó không?

EDIT: Mã Query là như dưới đây: Truy vấn

Criteria criteria = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(Order.class); 
List result = criteria.list(); 

SQL là: 1 SELECT tuyên bố cho Order bảng và một loạt các câu lệnh SELECT cho Shipment

+0

Bạn có thể hiển thị các mã cho các tiêu chí hoặc truy vấn bị sa thải? – RAS

Trả lời

0

Bạn cần phải xác định optional = false :

@OneToOne(optional = false, fetch = FetchType.LAZY) 

hoặc đơn giản là t Urn nó thành một @ManyToOne:

@ManyToOne(fetch = FetchType.LAZY) 
+3

Cảm ơn bạn. Tôi đã thử giải pháp của bạn nhưng kết quả là giống nhau –

+0

Kiểm tra câu trả lời cập nhật của tôi –

+2

Tôi cũng đã thử nghiệm với câu trả lời cập nhật của bạn nhưng kết quả vẫn như cũ. –

0

Hãy thử điều này:

Criteria criteria = HibernateUtil.getSessionFactory() 
           .getCurrentSession() 
           .createCriteria(Order.class) 
           .setFetchMode("shipment", FetchMode.LAZY); 
+1

Vui lòng thêm giải thích cho giải pháp của bạn – user7294900

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