2010-09-09 2 views
0

Здесь у меня есть вопрос о сохранении свойств «многие-ко-многим».Запрашиваемая помощь для сохранения свойств многих-ко-многим в Hibernate

Пример:

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 { 
} 

Предположительно, есть два фильма в дб:
Фильм А с Жанр X1 & X2
фильм B с Жанр Y1 & У2

Теперь я собираюсь скопировать жанры из фильма 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())); 

Тогда отношения Movie B & жанры сохраняются.

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

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

ответ

1

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

Вместо этого вы должны сделать окончательный сборник, избегая setGenre(), а вместо него вы должны ввести «умные» мутаторы, такие как addToGenre (жанр ... жанр), replaceGenres (List newGenres).

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

+0

JesperSM, вы определенно правы. Сборник жанров - это экземпляр org.hibernate.collection.PersistentBag, который несет отношения и т. Д. Большое спасибо! –

Смежные вопросы