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

Другие вопросы по тегам