Разница Unidirectional и Bidirectional связей в JPA Hibernate
Быстрый ответ
Односторонние ассоциации – это связь, где информация о наличии связи присутствует только у одной сущности:
@Entity
class User {
@OneToMany
List<Address> addresses; // Связь известна только User
}
Двусторонние ассоциации подразумевают взаимное владение информацией о связи двумя сущностями:
@Entity
class User {
@OneToMany(mappedBy="user")
List<Address> addresses; // User знает об Address...
}
@Entity
class Address {
@ManyToOne
User user; // ...а Address – о User. Они связаны взаимно.
}
Атрибут mappedBy
в двусторонних ассоциациях отмечает "владеющую сторону" связи.
Разбираемся подробнее: производительность, согласованность и архитектурные вопросы
Анализируем варианты ассоциаций
До принятия решения о реализации связей необходимо тщательно исследовать бизнес-требования. Не стоит создавать двусторонние связи без адекватной причины, так как они могут усложнить архитектуру приложения и снизить производительность без очевидных выгод.
Производительность и ее компромиссы
От выбора между отложенной загрузкой (@OneToMany
) и неотложенной загрузкой (@OneToOne
) зависит производительность. Неверное решение может превратить двусторонние ассоциации в узкое место, особенно при связях один-ко-многим и многие-ко-многим.
Соблюдение согласованности в двусторонних ассоциациях
Очень важно синхронизировать состояние обеих сторон в двусторонних связях для обеспечения целостности данных. Если этот аспект пренебречь, можно нарушить целостность кэшей и влиять на поведение транзакций.
Управление данными: фильтрация и пагинация
При работе с большими объемами данных применение фильтрации и пагинации может значительно повысить производительность и usability приложения для конечных пользователей.
Визуализация
Разницу между односторонними и двусторонними ассоциациями можно проиллюстрировать, представляя их как дороги, соединяющие два города:
Односторонние:
🏫 ---> 🏥
# Город А имеет дорогу до Города Б, но неизвестно, кто является её создателем 🕵️♂️
Двусторонние:
🏫 <---→ 🏥
# Между городами А и Б строится двусторонняя дорога. Они связаны через торговое партнёрство! 2️⃣↔️2️⃣
Таким образом, сущности в односторонней ассоциации связаны односторонне, а в двусторонней – обмениваются информацией взаимно.
Раскрываем сложности и даём рекомендации по использованию двусторонних ассоциаций
Определение "владеющей стороны"
В двусторонних связях Hibernate вводит понятие "владеющей стороны", обозначаемое через mappedBy
, для отслеживания связей при сохранении данных.
Синхронизация данных при проектировании
Для поддержания целостности следует учесть необходимость в дополнительных усилиях по синхронизации. Важно предусмотреть вспомогательные методы для координации данных, чтобы обеспечить правильное функционирование связей.
Hibernate и его рекомендации для больших приложений
Хотя в Hibernate двусторонние ассоциации рекомендуются для оптимизации запросов, всегда необходимо адаптировать эти рекомендации к особенностям производительности и сложности вашего приложения.
Расширенные запросы благодаря двусторонним ассоциациям
Двусторонние связи позволяют внедрять более сложные и эффективные запросы, включая возможность работы с данными через любую из связанных сторон.