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 аннотация для оптимистичной блокировки.

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