SEAM / Hibernate: я не могу получить изменения из базы данных во время разговора - PullRequest
2 голосов
/ 28 ноября 2010

У меня есть класс:

@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 Ответ

1 голос
/ 28 ноября 2010

Извините, что не могу придумать сложный ответ. Мне пришлось перезагрузить сущности из БД, которые были изменены другим serverlet. Я сделал это с помощью метода refresh() от JPA. Сессия Hibernate также предоставляет метод refresh(). Вы также можете рассмотреть аннотацию @Version для оптимистической блокировки.

...