Как обновить сущность в будущем? - PullRequest
1 голос
/ 03 мая 2011

Я не совсем уверен, в чем заключается моя проблема, поскольку я экспериментирую в двух областях, с которыми у меня мало опыта: JPA и Futures (с использованием заданий и обещаний Play! Framework).

Iиметь следующий бит кода, который я хочу вернуть объект Meeting, когда одному из полей этого объекта было присвоено значение, другим потоком из другого HTTP-запроса.Вот что у меня есть:

    Promise<Meeting> meetingPromise = new Job<Meeting> () {
        @Override
        public Meeting doJobWithResult() throws Exception {
            Meeting meeting = Meeting.findById(id);
            while (meeting.bbbMeetingId == null) {
                Thread.sleep(1000);
                meeting = meeting.refresh();       // I tried each of these
                meeting = meeting.merge();      // lines but to no avail; I
                meeting = Meeting.findById(id); // get the same result
            }
            return meeting;
        }
    }.now();
    Meeting meeting = await(meetingPromise);

Как я отмечаю в комментариях, там есть три строки, каждая из которых, я думаю, должна позволить мне обновить содержимое моего объекта из базы данных.Из отладчика кажется, что эти вызовы обновляют отношения многие-к-одному, но отдельные значения - нет.

Мой Meeting объект расширяет Play!Модель Framework, и для удобства, вот метод refresh:

/**
 * Refresh the entity state.
 */
public <T extends JPABase> T refresh() {
    em().refresh(this);
    return (T) this;
}

и метод merge:

/**
 * Merge this object to obtain a managed entity (usefull when the object comes from the Cache).
 */
public <T extends JPABase> T merge() {
    return (T) em().merge(this);
}

Итак, как я могу обновить мою модель избазы данных?

Ответы [ 2 ]

2 голосов
/ 06 мая 2011

Итак, я закончил кросс-постинг этого вопроса в группе play-framework , и там я получил ответ.Итак, для обсуждения, проверьте эту ветку.

В интересах поиска ответа в веб-поиске для всех, у кого есть эта проблема в будущем, вот как выглядит фрагмент кода, который я вставил ранее:

Promise<Meeting> meetingPromise = new Job<Meeting> () {         
    @Override
    public Meeting doJobWithResult() throws Exception {
        Meeting meeting = Meeting.findById(id);
        while (meeting.bbbMeetingId == null) {
            Thread.sleep(1000);
            if (JPA.isInsideTransaction()) {
                JPAPlugin.closeTx(false);
            }
            JPAPlugin.startTx(true);
            meeting = Meeting.findById(id);
            JPAPlugin.closeTx(false);
        }
        return meeting;
    }
}.now();
Meeting meeting = await(meetingPromise);

Я не использую аннотацию @NoTransaction, потому что она портит какой-то другой код, который проверяет, поступил ли запрос от действительного пользователя.

0 голосов
/ 03 мая 2011

Я не уверен в этом, но транзакции JPA автоматически управляются Play в контексте запроса / контроллера (JPAPlugin открывает транзакцию перед вызовом и закрывает ее после вызова).
Но я совсем не уверенчто происходит внутри рабочих мест, и я не думаю, что транзакции управляются автоматически (или это функция, которую я не знаю).Итак, ваша сущность связана с менеджером сущностей или все еще временно?Есть ли где-нибудь транзакция?Я не знаю, но это может объяснить странное поведение, если нет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...