JPA - Как обновить коллекцию в двунаправленных отношениях OneToMany/ManyToOne
У меня есть владельцы (категория) и клиенты (форум), созданные таким образом:
категория
...
@OneToMany( fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category" )
@OrderBy( "position" )
private List<Forum> forums;
...
Форум
...
@ManyToOne
@JoinColumn( name = "category" )
private Category category;
private Integer position;
...
Где-то в моем веб-приложении я отображаю список форумов и выполняю некоторые бизнес-действия на одном из них, например, изменяя его позицию.
Моя проблема в том, что изменения хорошо сохраняются в базе данных, но не отражаются в сопоставленной коллекции OneToMany. Таким образом, когда я обновляю страницу, которая отображает список, он показывает не новую позицию, а предыдущую.
Код, который я использую для обновления позиции элемента, эквивалентен простому em.merge( forum )
, Я читал во многих темах, что мне следует "вручную управлять" двунаправленными отношениями, иначе я столкнулся бы с такого рода проблемами. Вот мои два вопроса:
- Я пробовал как EclipseLink, так и Hibernate, и хотя он хорошо работает с Hibernate (список обновляется), его нет в EclipseLink. Это связано с некоторой разницей в режиме кэширования?
- Как мне вручную заметить в моем списке, что одно из свойств его элемента изменилось (например, свойство position форума в списке форумов)?
[РЕДАКТИРОВАТЬ] Я читаю эту тему и чувствую, что моя проблема связана с тем, что мой форум обновляется с помощью сеанса, отличного от того, который используется для получения списка. Я правильно понимаю? Если да, как правильно управлять этим делом?
1 ответ
Предполагая, что вы устанавливаете обе стороны объектов (вы должны!), Попробуйте отключить кэш eclipselink:<property name="eclipselink.cache.shared.default" value="false"/>
@source http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F