Я схильний використовувати Hibernate у поєднанні з Spring framework та його декларативними можливостями розмежування транзакцій (наприклад, @Transactional ).
Як ми всі знаємо, сплячий режим намагається бути максимально неінвазивним і максимально прозорим , однак це виявляється дещо складнішим при використанні lazy-loaded
відносин.
Я бачу ряд дизайнерських альтернатив з різним рівнем прозорості.
- Зробіть стосунки не ледачими (наприклад,
fetchType=FetchType.EAGER)
- Це порушує всю ідею ледачого завантаження ..
- Ініціалізуйте колекції за допомогою
Hibernate.initialize(proxyObj);
- Це передбачає відносно високу зв'язок з DAO
- Хоча ми можемо визначити інтерфейс з
initialize
, інші реалізації не гарантують надання будь-якого еквівалента.
- Додайте поведінку транзакцій до самих стійких
Model
об’єктів (використовуючи динамічний проксі-сервер або@Transactional
)- Я не пробував підхід динамічного проксі-сервера, хоча ніколи не здавався, щоб @Transactional працював над самими стійкими об'єктами. Можливо, завдяки цьому сплячому режиму є операція над проксі-сервером, з яким слід працювати.
- Втрата контролю, коли операції фактично відбуваються
- Надайте як ледачий, так і не ледачий API, наприклад,
loadData()
іloadDataWithDeps()
- Змушує програму знати, коли застосовувати яку рутину, знову щільне зчеплення
- Метод переповнення,,
loadDataWithA()
....,loadDataWithX()
- Примусово шукати залежності, наприклад, лише забезпечуючи
byId()
операції- Потрібно багато необ'єктно-орієнтованих процедур, наприклад,,
findZzzById(zid)
а потімgetYyyIds(zid)
замістьz.getY()
- Може бути корисним отримання кожного об’єкта в колекції по одному, якщо між транзакціями є великі накладні витрати на обробку.
- Потрібно багато необ'єктно-орієнтованих процедур, наприклад,,
- Зробіть частину програми @Transactional замість лише DAO
- Можливі міркування про вкладені транзакції
- Потрібні процедури, адаптовані для управління транзакціями (наприклад, досить малі)
- Невеликий програмний вплив, хоча може призвести до великих операцій
- Надайте DAO динамічні профілі отримання , наприклад,
loadData(id, fetchProfile);
- Програми повинні знати, який профіль використовувати коли
- Тип транзакцій AoP, наприклад, операції перехоплення та виконання транзакцій за необхідності
- Потрібна маніпуляція з байт-кодом або використання проксі
- Втрата контролю під час здійснення транзакцій
- Чорна магія, як завжди :)
Я пропустив якийсь варіант?
Який ваш найкращий підхід при спробі мінімізувати вплив lazy-loaded
взаємозв’язків у дизайні вашого додатка?
(О, і вибачте за WoT )