Разница Unidirectional и Bidirectional связей в JPA Hibernate

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Односторонние ассоциации – это связь, где информация о наличии связи присутствует только у одной сущности:

Java
Скопировать код
@Entity
class User {
    @OneToMany
    List<Address> addresses; // Связь известна только User
}

Двусторонние ассоциации подразумевают взаимное владение информацией о связи двумя сущностями:

Java
Скопировать код
@Entity
class User {
    @OneToMany(mappedBy="user")
    List<Address> addresses; // User знает об Address...

}

@Entity
class Address {
    @ManyToOne
    User user;               // ...а Address – о User. Они связаны взаимно.
}

Атрибут mappedBy в двусторонних ассоциациях отмечает "владеющую сторону" связи.

Кинга Идем в IT: пошаговый план для смены профессии

Разбираемся подробнее: производительность, согласованность и архитектурные вопросы

Анализируем варианты ассоциаций

До принятия решения о реализации связей необходимо тщательно исследовать бизнес-требования. Не стоит создавать двусторонние связи без адекватной причины, так как они могут усложнить архитектуру приложения и снизить производительность без очевидных выгод.

Производительность и ее компромиссы

От выбора между отложенной загрузкой (@OneToMany) и неотложенной загрузкой (@OneToOne) зависит производительность. Неверное решение может превратить двусторонние ассоциации в узкое место, особенно при связях один-ко-многим и многие-ко-многим.

Соблюдение согласованности в двусторонних ассоциациях

Очень важно синхронизировать состояние обеих сторон в двусторонних связях для обеспечения целостности данных. Если этот аспект пренебречь, можно нарушить целостность кэшей и влиять на поведение транзакций.

Управление данными: фильтрация и пагинация

При работе с большими объемами данных применение фильтрации и пагинации может значительно повысить производительность и usability приложения для конечных пользователей.

Визуализация

Разницу между односторонними и двусторонними ассоциациями можно проиллюстрировать, представляя их как дороги, соединяющие два города:

Односторонние:

🏫 ---> 🏥
# Город А имеет дорогу до Города Б, но неизвестно, кто является её создателем 🕵️‍♂️

Двусторонние:

🏫 <---→ 🏥
# Между городами А и Б строится двусторонняя дорога. Они связаны через торговое партнёрство! 2️⃣↔️2️⃣

Таким образом, сущности в односторонней ассоциации связаны односторонне, а в двусторонней – обмениваются информацией взаимно.

Раскрываем сложности и даём рекомендации по использованию двусторонних ассоциаций

Определение "владеющей стороны"

В двусторонних связях Hibernate вводит понятие "владеющей стороны", обозначаемое через mappedBy, для отслеживания связей при сохранении данных.

Синхронизация данных при проектировании

Для поддержания целостности следует учесть необходимость в дополнительных усилиях по синхронизации. Важно предусмотреть вспомогательные методы для координации данных, чтобы обеспечить правильное функционирование связей.

Hibernate и его рекомендации для больших приложений

Хотя в Hibernate двусторонние ассоциации рекомендуются для оптимизации запросов, всегда необходимо адаптировать эти рекомендации к особенностям производительности и сложности вашего приложения.

Расширенные запросы благодаря двусторонним ассоциациям

Двусторонние связи позволяют внедрять более сложные и эффективные запросы, включая возможность работы с данными через любую из связанных сторон.

Полезные материалы