2011-07-08 24 views
6

Sau khi nâng cấp lên một phiên bản mới hơn Hibernate (đoán nó đi kèm với công tắc từ JBoss 4.2.2 để JBoss 6), một số truy vấn thất bại với thông điệp:"Tự động" tham gia lấy các thực thể lồng nhau thất bại sau khi cập nhật Hibernate

Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=null,role=null,tableName= (...)

này luôn luôn là trường hợp khi sử dụng một truy vấn như thế này:

SELECT entityA FROM EntityA entityA 
JOIN FETCH entityA.entityB 
LEFT JOIN FETCH entityA.entityB.someField 
WHERE entityA.entityB.anotherField LIKE :someParameter 

các giải pháp cho vấn đề là để cho "entityA.entityB" một bí danh và sau đó sử dụng bí danh này trong mệnh đề WHERE. Nhưng trong một số truy vấn, LEFT JOIN FETCH không được đưa ra một cách rõ ràng nhưng vẫn là mệnh đề WHERE sử dụng thuộc tính của thực thể được tham chiếu. Nó cũng sẽ thất bại ở đó? Điều gì đã thay đổi, để nó đột nhiên thất bại sau khi chuyển sang một phiên bản JBoss mới?

question sau đây có liên quan đến câu hỏi này và bao gồm giải pháp, nhưng không giải thích được sự cố.

+0

Câu hỏi của bạn đã giúp tôi tìm ra giải pháp cho vấn đề của mình, sau khi nâng cấp từ hibernate 3.2.6.ga lên 3.5.6-Final, tôi đã nhận được truy vấn chỉ định tìm nạp, nhưng chủ sở hữu của liên kết đã tìm nạp không có mặt trong danh sách lựa chọn ', sử dụng cách tiếp cận bí danh mà bạn đề xuất nó hoạt động, không thể giúp bạn với' lý do 'mặc dù! –

+0

là HQL này hoặc JPQL tiêu chuẩn? – wrschneider

+0

Điều này được thực hiện thông qua 'EntityManager.createQuery', vì vậy tôi đoán đó là HQL. –

Trả lời

3

Truy vấn nên

SELECT entityA FROM EntityA entityA 
JOIN FETCH entityA.entityB entityB 
LEFT JOIN FETCH entityB.someField 
WHERE entityB.anotherField LIKE :someParameter 

Tức là bạn nên gán một bí danh cho mỗi thực thể được nối, và sử dụng bí danh này cho các phép nối hoặc hạn chế tiếp theo.

+0

Vâng tôi biết .. nhưng nó luôn luôn là theo cách này. Và việc chuyển từ Hibernate 3 sang 4 đã thay đổi sự chấp nhận bằng cách nào đó và điều này gây ra rất nhiều công việc di trú cho chúng ta. Tôi chỉ muốn biết lý do tại sao họ đột nhiên ngừng làm cho Hibernate trở về tương thích ngược trong thời gian ngắn. –

+0

Tôi đoán là mã của bạn đã hoạt động một cách tình cờ, bằng cách dựa vào một lỗi Hibernate đã được sửa ngay bây giờ. –

0

Tôi gặp vấn đề tương tự trong dự án và rất khó giải quyết vì tôi có hệ thống kế thừa lớn với nhiều mô-đun sử dụng truy vấn được tạo trước và nhiều truy vấn được tạo theo yêu cầu. Để xác định và sửa đổi toàn bộ hệ thống và thực hiện các thay đổi đang làm việc cũng như sử dụng một phiên bản cũ của ngủ đông là một công việc rất khó chịu và dễ bị lỗi. Tôi đang đi qua vấn đề này trong JBoss từ 6.4 đến 6.4.6 khi phiên bản ngủ đông được nâng cấp từ 4.2.18 lên 4.2.22 và lỗi này xuất hiện. Để giải quyết nó tôi làm cho một hạ cấp của chỉ có mô-đun chính ngủ đông ban đầu mặc định phiên bản 4.2.18 nhưng điều này là không tốt bởi vì khi các bản vá tiếp theo của JBoss đến tôi cần phải thay đổi nó một lần nữa. Tôi đang cố gắng sử dụng các mô-đun JBoss và một số cấu hình trong persistence.xml và jboss-deployment-strcuture.xml nhưng chưa thành công.

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