Tôi có xu hướng sử dụng Hibernate kết hợp với Spring framework và khả năng phân định giao dịch mang tính khai báo của nó (ví dụ: @Transactional ).
Như chúng ta đã biết, chế độ ngủ đông cố gắng không xâm lấn và càng minh bạch càng tốt, tuy nhiên điều này chứng tỏ một chút thách thức hơn khi sử dụng các lazy-loaded
mối quan hệ.
Tôi thấy một số phương án thiết kế với các mức độ minh bạch khác nhau.
- Làm cho các mối quan hệ không bị tải chậm (ví dụ:
fetchType=FetchType.EAGER)
- Điều này xác minh toàn bộ ý tưởng về tải chậm ..
- Khởi tạo bộ sưu tập bằng
Hibernate.initialize(proxyObj);
- Điều này ngụ ý khả năng ghép nối tương đối cao với DAO
- Mặc dù chúng ta có thể xác định giao diện với
initialize
, nhưng các triển khai khác không được đảm bảo cung cấp bất kỳ giao diện nào tương đương.
- Thêm hành vi giao dịch vào chính các
Model
đối tượng liên tục (sử dụng proxy động hoặc@Transactional
)- Tôi chưa thử phương pháp proxy động, mặc dù dường như tôi chưa bao giờ thấy @Transactional hoạt động trên chính các đối tượng liên tục. Có thể do ngủ đông đó là hoạt động trên một proxy để kết nối.
- Mất kiểm soát khi giao dịch thực sự diễn ra
- Cung cấp cả API lười biếng / không lười biếng, ví dụ:
loadData()
vàloadDataWithDeps()
- Buộc ứng dụng biết khi nào nên sử dụng quy trình nào, một lần nữa khớp nối chặt chẽ
- Phương thức tràn
loadDataWithA()
,, ....,loadDataWithX()
- Buộc tra cứu các phần phụ thuộc, ví dụ, bằng cách chỉ cung cấp các
byId()
hoạt động- Yêu cầu nhiều quy trình không hướng đối tượng, ví dụ
findZzzById(zid)
, và sau đógetYyyIds(zid)
thay vìz.getY()
- Có thể hữu ích khi tìm nạp từng đối tượng trong bộ sưu tập một nếu có chi phí xử lý lớn giữa các giao dịch.
- Yêu cầu nhiều quy trình không hướng đối tượng, ví dụ
- Tạo một phần của ứng dụng @Transactional thay vì chỉ DAO
- Các cân nhắc có thể xảy ra đối với các giao dịch lồng nhau
- Yêu cầu các quy trình được điều chỉnh để quản lý giao dịch (ví dụ: vừa đủ nhỏ)
- Tác động có lập trình nhỏ, mặc dù có thể dẫn đến các giao dịch lớn
- Cung cấp cho DAO các cấu hình tìm nạp động , ví dụ:
loadData(id, fetchProfile);
- Ứng dụng phải biết hồ sơ nào sẽ sử dụng khi
- Loại giao dịch AoP, ví dụ: chặn hoạt động và thực hiện giao dịch khi cần thiết
- Yêu cầu thao tác mã byte hoặc sử dụng proxy
- Mất kiểm soát khi giao dịch được thực hiện
- Ma thuật đen, như mọi khi :)
Tôi có bỏ lỡ bất kỳ lựa chọn nào không?
Cách tiếp cận ưa thích của bạn là gì khi cố gắng giảm thiểu tác động của các lazy-loaded
mối quan hệ trong thiết kế ứng dụng của bạn?
(Ồ, và xin lỗi WoT )