Я хотел бы добиться экспорта (дампа) базы данных в SQL Server с одного сервера и импортировать этот дамп на другой SQL Server и не обязательно с тем же именем схемы.
Например, если у меня есть база данных, подготовленная со всем набором данных для реализации новой БД для нового клиента,
hibernate пытается быть неинвазивным и максимально прозрачным , однако это оказывается немного сложнее при использовании lazy-loaded
отношения.
Я вижу несколько вариантов дизайна с разным уровнем прозрачности.
- Сделать отношения не загружаемыми с ленивой загрузкой (например,
fetchType = FetchType.EAGER)
- Это нарушает всю идею отложенной загрузки.
- Инициализируйте коллекции, используя
Hibernate.initialize (proxyObj);
- Это подразумевает относительно высокую степень связи с DAO
- . Хотя мы можем определить интерфейс с помощью
initialize
, другие реализации не гарантируют предоставления каких-либо эквивалентов.
- Я не пробовал использовать метод динамического прокси, хотя мне никогда не удавалось заставить @Transactional работать с самими постоянными объектами. Вероятно, из-за этого спящий режим - это работа с прокси-сервером.
- Потеря контроля при фактическом выполнении транзакций
- Обеспечение как ленивого, так и неленивого API, например
loadData ()
и loadDataWithDeps ()
- Заставляет приложение знать когда использовать какую подпрограмму, опять же сильная связь
- Переполнение метода,
loadDataWithA ()
, ...., loadDataWithX ()
- Принудительный поиск зависимостей, например, только путем предоставления
byId ()
операций
- Требуется множество не объектно-ориентированных подпрограмм, например,
findZzzById (zid)
, а затем getYyyIds (zid)
вместо z.getY ()
- Может быть полезно получать каждый объект в коллекции по одному, если между транзакциями есть большие накладные расходы на обработку.
- Сделать частью приложения @Transactional вместо только DAO
- Возможные аспекты вложенных транзакций
- Требуются процедуры, адаптированные для управления транзакциями (например, достаточно маленькие)
- Небольшое влияние на программу, хотя может привести к большим транзакциям
- Предоставьте DAO динамические профили выборки , например,
loadData (id, fetchProfile);
- Приложения должны знать, какой профиль использовать, когда
- Тип транзакций AoP, например,
- Требуются манипуляции с байтовым кодом или использование прокси.
- Потеря контроля при выполнении транзакций
- Черная магия, как всегда :)
Я пропустил какой-либо вариант?
Какой подход вы предпочитаете при попытке минимизировать влияние ленивых
отношений на дизайн вашего приложения?
(Ой, извините за WoT )
задан Johan Sjöberg 17 February 2011 в 09:18
поделиться