SEAM/Hibernate: я не могу получить изменения из базы данных во время разговора
У меня есть класс:
@Name("foo")
@Scope(ScopeType.CONVERSATION)
public class Foo {
@In
Session session;
@In
private Conversation conversation;
@RequestParameter
Long barId;
/* outjected fields */
@Out
Bar bar;
/* some attributes and methods */
public void start() {
/* some initializations */
this.bar = (Bar) session.get(Bar.class, barId);
}
public void end() {
/* some actions involving bar and bar.getBaz() */
conversation.end();
}
}
Метод start () вызывается в начале диалога и инициализирует панель атрибутов (Bar - это некоторый класс сущностей). Затем bar имеет атрибут baz, который также является сущностью.
Во время разговора может случиться так, что другой пользователь изменяет объект baz, связанный с нашей панелью. Затем, когда вызывается end (), bar.getBaz() возвращает старую (неизмененную) версию baz и, кроме того, перезаписывает ее в базу данных.
Я пытался получить измененное состояние baz в методе end (), используя session.flush(), session.merge(bar), session.merge(bar.getBaz()), но ничего не работает. Как я могу избежать загрязнения в базе данных?
1 ответ
Извините, что я не могу придумать сложный ответ. Мне пришлось перезагрузить сущности из БД, которые были изменены другим serverlet. Я сделал это с помощью refresh()
метод из JPA. Сессия Hibernate также обеспечивает refresh()
метод. Вы также можете рассмотреть @Version
аннотация для оптимистичной блокировки.