Hibernate sử dụng proxy để cho phép tải chậm bộ sưu tập và thậm chí cả các kết hợp một lần. Theo tài liệu tham khảo của Hibernate (3.6.5) (Mục 21.1.3, proxy kết hợp một lần), chẳng hạn proxy không thể được xây dựng bởi Hibernate nếu nó chứa "bất kỳ phương thức cuối cùng nào".
Câu hỏi của tôi là, hạn chế này có áp dụng cho getters/setters của các trường liên tục hoặc thực sự cho bất kỳ phương thức nào trong một lớp thực thể không? Vì vậy, thực hiện một phương pháp như thế này:Phương pháp cuối cùng có ngăn Hibernate tạo proxy cho thực thể như vậy không?
public final String toString() {
return this.getClass().getSimpleName() + id;
}
thực sự ngăn cản việc tạo proxy (CGLIB hoặc Javassist) cho thực thể này? Việc sử dụng truy cập dựa trên trường hoặc thuộc tính có quan trọng không? Kể từ khi CGLIB được thay thế bởi Javassist, điều này có cung cấp thêm bất kỳ tính năng nào theo hướng này không?
Tôi thích sử dụng thừa kế trong phân cấp thực thể và do đó yêu cầu xác định một số phương thức cuối cùng, ví dụ: trong lớp cơ sở để ngăn các lớp con ghi đè các phương thức đó.
cảm ơn trước!
Tôi nghĩ rằng _ "ngay sau khi phương pháp này sử dụng bất kỳ trường liên tục hoặc trực tiếp hoặc thông qua một phương pháp dụ khác này sẽ bỏ qua proxy" _ là hơi không chính xác. Trong phương thức cuối cùng 'this' sẽ cần thiết là proxy, vì vậy ngay sau khi một phương thức instance cuối cùng được gọi là target sẽ được khởi tạo. Tất nhiên truy cập vào bất kỳ trường nào trực tiếp trong phương thức cuối cùng sẽ truy cập trường không được khởi tạo trên proxy vì vậy đây luôn là vấn đề. –
Để làm rõ những gì @ MichałPolitowski vừa nói: Các phương pháp cuối cùng không truy cập vào trạng thái là tốt. Các phương thức cuối cùng mà chỉ truy cập trạng thái thông qua một phương thức khác cũng tốt. Nhưng phương thức cuối cùng sẽ thất bại (và có thể thất bại) nếu nó sử dụng một trường cá thể trực tiếp. Có 3 cách để giải quyết vấn đề này. Đầu tiên là không khai báo phương thức cuối cùng. Thứ hai là không truy cập trực tiếp các trường từ các phương thức cuối cùng. Thứ ba là tắt proxy bằng cách cài đặt lazy = "false" (không được khuyến nghị vì lý do hiệu suất). – MarcG
Nếu bạn sử dụng Intellij IDEA, vui lòng bỏ phiếu để tạo ra một cuộc kiểm tra giải quyết vấn đề này: http://youtrack.jetbrains.com/issue/IDEA-128132 – MarcG