Обращение за помощью к сохранению свойств многие ко многим в Hibernate - PullRequest
0 голосов
/ 09 сентября 2010

Здесь у меня вопрос о постоянных свойствах «многие ко многим».

Пример:

class Movie {
    /**
     * @hibernate.bag cascade="save-update" table="movie_genre"
     * @hibernate.collection-key column="ITEM_ID"
     * @hibernate.collection-many-to-many column="GENRE_ID" class="Genre"
     * @hibernate.collection-cache usage="read-write"
     */
    public List<Genre> getGenres() {
        return genres;
    }
...  
}

class Genre {
}

Предположим, в БД есть два фильма:
Фильм A с жанром X1 и X2
Фильм B с жанром Y1 и Y2

Теперь я собираюсь скопировать жанры из фильма A в фильм B со следующим кодом:

Movie b = findById('B');
Movie a = findById('A');
a.setGenres(b.getGenres());
session.saveOrUpdate(a);
session.flush();

Теперь отношения оригинальных фильмов B и жанров удалены. Но, если я ссылаюсь на следующий код:

a.setGenres(new ArrayList(b.getGenres()));

Затем отношения Фильм B и жанры сохраняются.

В первом фрагменте кода: hibernate вызовет два удаления sql в таблице отношений movie_genre, которые удаляют отношения Movie B & A;
Во втором: hibernate вызовет удаление sql, чтобы удалить только фильм A.

Это механизм для Hibernate для сохранения объектов отношений? Не могли бы вы дать мне несколько советов?

1 Ответ

1 голос
/ 10 сентября 2010

Список жанров, который Hibernates создает для вас, не является простым java.util.LinkedList, он подключен к сеансу и поддерживает ленивую выборку, минимальные операции размещения и еще много чего.В этом случае он несет информацию о своем родительском объекте, и когда вы перемещаете его, он вносит нежелательные обновления в таблицу ассоциации.

Вместо этого вы должны сделать фактическую коллекцию окончательной, избегая setGenre () и вместоэто, вы должны ввести "умнее" мутаторы, такие как addToGenre (Genre ... жанр), replaceGenres (список новых Genre).

Надеюсь, это поможет!

...