Hibernate OneToMany java.util.Map

Эта статья является частью книги про Spring Framework, которая по планам должна выйти где-нибудь в 2024 году, ну в крайнем случае в 2025, если не все будет получаться.

Hibernate позволяет отобразить связь один ко многим не только в виде реализаций интерфейса List и Set, но и в качестве реализации Map с определённым ключом.

В качестве примера возьмём следующую базу данных:

Пусть вас не сильно пугают страшные названия вторичных ключей, эта схема была сгенерирована Hibernate, я не сам их так называл, всё это просто для примера.

А теперь представьте, что мы хотим сделать так, чтобы в сущности Pet (питомец) можно было вытащить количество еды определённого типа PetFood по известному коду этой еды food.code. Имеется в виду, чтобы можно было сделать как-то так:

Подобное вполне можно осуществить с помощью Hibernate.

Для начала сделаем класс сущности Food:

Колонку code сделали перечислением FoodType, можно было использовать String, но тогда была бы возможность попытаться вставить в это поле какое-нибудь совершенно левое значение. Само перечисление FoodType:

Сущность PetFood:

Основная часть в сущности Pet. Мы используем аннотацию @MapKey, чтобы указать поле из PetFood, в котором хранится ключ нашей java.util.Map со списком доступных кормов питомца, а также аннотацию @OneToMany, в которой указываем поле из PetFood, в котором хранится ссылка на нашу сущность Pet:

А теперь сделаем небольшой пример использования наших сущностей:

В коде выше мы просто инициализируем Hibernate и добавляем аннотированные сущности.

Сами тесты:

Здесь мы просто выполняем простенькие операции с нашими сущностями и нашей Map в Pet. При этом в логе мы можем увидеть SQL-команды вставки значений в базу данных и выборки значений:

Исходные коды примера на GitHub

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *