2013-11-07 2 views
2

У меня есть владелец (категория) и клиент (Форум) лица разработаны таким образом:JPA - Как обновить коллекцию в би-directionnal 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 (список обновляется), он doens't в EclipseLink. Связано ли это с некоторыми различиями в режиме кэширования?
  • Как я должен вручную заметить мой список, что одно из свойств его элемента изменилось (например, свойство позиции форума в списке форумов)?

[EDIT] Я читал this topic, и я чувствую, что моя проблема связана с моим форумом обновляется с помощью другого сеанса от одного используется для извлечения списка. Правильно ли я это понимаю? Если да, то как правильно управлять этим делом?

+0

Я предполагаю, что вы установите оба конца при создании объектов? – membersound

ответ

1

Предполагая, что вы установили обе стороны объектов (! Вы должны), попробуйте отключить кэш EclipseLink: <property name="eclipselink.cache.shared.default" value="false"/>

@source http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

+0

Отключение кеша не решает проблему: новая позиция форума сохраняется в базе данных, но список не изменяется. – Med

+0

Я думаю, что это именно мой второй вопрос здесь: я чувствую себя немного глупо, но я не вижу, что я должен сделать, чтобы обновить список. Поскольку я не удалял или не добавлял элемент в свой список, а менял только один уже существующий, как я должен вручную указать свой список, чтобы отразить это изменение? – Med

+0

Плохо, твой трюк действительно работает! Оказывается, две среды, которые я использовал для тестирования с Hibernate, и EclipseLink не только отличались на уровне персистентности, но и на уровне представления (разные версии моджары JSF). У одной с EclipseLink была старая версия mojarra, содержащая ошибку о состояниях представления в вложенных циклах. Мне повезло, что я понял, что потратил бы несколько недель, чтобы узнать иначе! Теперь все работает нормально, когда я отключу кеш. ** Означает ли это, что если я хочу использовать этот кэш L2, мне нужно найти другой способ для обновления моих объектов? ** – Med

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

  • Нет связанных вопросов^_^