Я схильний використовувати 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 )