Гибернация отношения многие ко многим, чтобы сохранить только связь в таблице соединений - PullRequest
2 голосов
/ 17 февраля 2012

У меня есть две сущности в hibernate (хранилище базы данных MySQL), которые связаны многие со многими. Это «Проект» и «Категория».

Проект <---> Категория

У меня есть таблица соединений с именем "project_category", чтобы объединить эти объекты, хранящиеся в таблицах "project" и "category". В таблице соединений хранятся только первичные ключи из этих таблиц. Это ключи "project_id" и "category_id".

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

В моем отображении для класса "Project" я указал переход "многие ко многим" из Project в категорию с использованием таблицы "project_category", которая выглядит следующим образом:

<set name="categories" table="project_category" fetch="join" cascade="persist">
   <key column="project_Id" />
   <many-to-many column="category_Id" class="Category"/>
</set>

Это то, чего я хочу достичь ..

Я хочу сохранить проект и связанные с ним категории (здесь я не хочу создавать какие-либо новые категории, просто свяжите category_id с моим project_id). Категории уже существуют, и я хочу использовать их при каждом сохранении нового проекта.

В коде я создал коллекцию нужных категорий (из множества категорий, которые есть в таблице категорий) и добавил к экземпляру проекта, пытаясь сохранить проект с помощью спящего режима. Теперь ожидаем, что project_category будет содержать ассоциацию проекта и категорий.

Я наблюдаю, что при сохранении Project спящий режим пытается перейти в категорию (это не то, чего я хочу, потому что у меня уже есть созданная категория - я хочу просто связать ее с моим новым проектом).

Какое отображение нужно для достижения поставленной цели?

Я прочитал эту хорошую статью, но здесь автор создает обе сущности, а не использует уже созданную. http://technicalmumbojumbo.wordpress.com/2007/09/25/investigating-hibernate-associations-many-to-many/

Ответы [ 2 ]

0 голосов
/ 18 июля 2013

Когда категории уже существуют в базе данных, вы просто устанавливаете cascade в none . Конфигурация «многие ко многим» для проекта и категории следующим образом:

<set name="categories" table="project_category" fetch="join" cascade="none">
      <key column="project_Id" />
      <many-to-many column="category_Id" class="Category"/>
</set>

Из этой конфигурации вставка hibernate только в таблице project и project_category.

0 голосов
/ 17 февраля 2012

Если категории уже существуют, вам не следует создавать новые экземпляры. Вы должны получить их из базы данных, используя сеанс Hibernate.

Если у вас есть идентификаторы категорий, которые необходимо связать с новым проектом, и вы не хотите выполнять запрос на выборку, чтобы получить эти категории из базы данных (потому что эти категории не могут быть в базы данных), затем просто используйте метод Session.load():

Set<Long> categoryIds = ...;
for (Long categoryId : categoryIds) {
    Category category = (Category) session.load(Category.class, categoryId);
    newProduct.add(category);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...