Đây là một câu hỏi thiết kế, mã bê tông không được gửi để bảo vệ đáy của tôi.org.hibernate.Session.clear() được coi là có hại?
Khi làm việc với Hibernate các quy trình làm việc giữa các ý kiến như sau:
- mở phiên
- Bắt đầu giao dịch
- Làm kinh doanh (đọc và sửa đổi dữ liệu)
- Commit Transaction
- Đóng phiên
có thể có thể lặp qua 2-4.
Trường hợp sử dụng hợp lý cho Session.clear() là gì?
A: Vấn đề cụ thể mà tôi có là một đoạn mã lớn tải và sửa đổi các thực thể, sau đó xóa() của phiên, về cơ bản loại bỏ các thay đổi đã được thực hiện. (Nhiệm vụ kinh doanh cần thực hiện không bao gồm sửa đổi các thực thể, do đó, mã "hoạt động").
Dường như với tôi thiết kế phù hợp là đảm bảo đoạn mã (lớn) không thực hiện các thay đổi mà nó không muốn lưu?
B: Tôi đoán Session.clear() tồn tại để thuận tiện/linh hoạt, không phải vì ý tưởng hay là sử dụng nó.
Tôi đã hiểu lầm triết lý Hibernate chưa?
C: Câu hỏi con: Có phải ý tưởng tồi về mã khung để vô điều kiện rõ ràng() phiên khi tác vụ hoàn tất không? IMHO, khuôn khổ nên khiếu nại nếu phiên là bẩn khi một nhiệm vụ hoàn thành! Phiên họp phải được đóng lại, xem khi công việc được thực hiện ... (Bỏ qua hiệu suất cho từng phút)
(Nhãn A, B và C để bạn có thể chỉ ra phần nào bạn đang trả lời).
ad A): Xử lý các tập dữ liệu lớn trong một giao dịch có vẻ như thiết kế tồi với tôi (được cấp, tôi có thể không nghĩ đến tất cả các sự cố có thể xảy ra ...). Ý bạn là gì bởi "rõ ràng" bền bỉ một thực thể? session.save (thực thể)? Quảng cáo C): Có vẻ như chúng tôi đồng ý các khung công tác không nên làm điều này - khung công tác không thể chắc chắn những gì khách hàng làm. :-) –
@MortenLauritsenKhodabocus: rõ ràng, tải và sửa đổi hàng ngàn bản ghi trong một giao dịch Hibernate là một dấu hiệu cho thấy một công cụ khác nhau nên được sử dụng. Có, bởi * rõ ràng * Tôi có nghĩa là gọi 'save()' như trái ngược với việc cho phép Hibernate khám phá các thực thể bẩn. –
@MortenLauritsenKhodabocus Hãy khai sáng cho tôi. Tại sao bạn nên xử lý một tập dữ liệu chỉ đọc lớn trong một Giao dịch? Dường như với tôi rằng nếu nó liên quan đến việc đặt hàng ở phía DB, nó sẽ là thông minh bởi vì nó sẽ tiết kiệm được từ việc cần phải sắp xếp lại nhiều lần. Không sử dụng giao dịch có nghĩa là DB sẽ nhớ trạng thái đặt hàng của bạn trên các truy vấn khác nhau là một phần của cùng một giao dịch? Ngoài ra, không phải là 'sử dụng một giao dịch' chính xác những gì ScrollableResults API của Hibernate làm gì? – KyleM