Play Framework: действие слияния работает только в том Контроллере, который его вызвал - PullRequest
3 голосов
/ 16 ноября 2011

У меня есть простое приложение Play для тестирования. У меня есть 2 контроллера, один из них «ListController», который отображает список записей. Каждая запись имеет ссылку «редактировать», которая ведет к «EditController». «EditController» отображает HTML-форму с существующими данными для записи, и кнопка «Отправить» отправляет эти данные в другой метод в «EditController», который сохраняет данные в БД и повторно отображает вновь измененные данные в форме. Все это работает хорошо. Однако, как только я изменяю запись (которая отображается правильно на странице редактирования), когда я возвращаюсь к списку, эта запись все еще имеет старые значения, и редактирование все равно показывает ее со старыми значениями. Это происходит как в тестовой среде, так и в среде разработки.

Вот мои настройки:

  • инициализация данных из файла data.yml через @OnApplicationStart аннотированный класс BootStrap
  • тестовая среда, настроенная с:

    % test.db = фс

    % test.jpa.ddl = создать

  • Среда разработки, сконфигурированная с:

дБ = Postgres: // Postgres: Postgre @ LOCALHOST: 5432 / воспроизведение

  • ListController:

    Список laundryLists = LaundryList.findAll ();

-EditController

LaundryList updatedLaundryList = LaundryList.em().merge(laundryList);

Я добавил вывод журнала и, конечно же, после вызова метода merge в EditController, даже если я добавляю код для извлечения обновленного объекта из базы данных, он возвращает бин с правильно обновленными значениями, такими как, как я вставил их

Тем не менее, даже после этого, в тестовой (игра-тест) или запуска (игра-бег) среде после повторного ввода (или щелчка по ссылке) для ListCOntroller, он по-прежнему отображает (предположительно) измененную запись со значениями ДО обновления произошло в EditController. И если я щелкну, чтобы отредактировать его снова, форма покажет мне, что исходные неизмененные данные для записи.

У меня вопрос: что я должен делать, чтобы данные сохранялись в базе данных?

1 Ответ

6 голосов
/ 16 ноября 2011

Я нашел решение, но это очень разочаровывает.

Короче говоря, я заменил эту строку:

LaundryList.em () сливаются (laundryList);.

с этим:

LaundryList updateLaundryList = LaundryList.em().merge(laundryList);
updateLaundryList.save();

Длинный ответ: Play изменил способ работы JPA. В приведенном выше случае я участвовал в транзакции (это было ясно показано в журналах и в том факте, что, если я попытаюсь начать транзакцию, возникнет исключение, говорящее мне, что я фактически уже выполняю транзакцию). Однако, несмотря на это, выполнение em().merge фактически не делало никаких вставок / обновлений в сторону базы данных, как показано в журналах.

Да, в какой-то момент на своем сайте они говорят что-то вроде: «нам не нравится, как JPA выполняет автосинхронизацию данных, когда вы находитесь в транзакции, поэтому вам не нужно вызывать persist / merge, но вам нужно вызывать refresh of your infact, чтобы отменить ваши изменения, и нам это не нравится, поэтому мы изменили его: теперь вам нужно явно сохранять, или ничего не обновляется ".

Они также говорят (и здесь я нашел фактическую цитату):

"Во время последовательных запросов извлекайте объект из базы данных, используя идентификатор объекта, обновляйте его и сохраняйте снова."

Но это все. Нет примеров кода нет ничего. Так как они изменили поведение фреймворка, который НАМНОГО более известен, чем Play (а именно JPA), они должны действительно указать это более четко или, по крайней мере, изменить имена классов, сделать обертки, скажем, что они создали свой собственный PlayPersistenceManager или что-то подобное .

И нет, лично я не думаю, что их путь лучше. В целом, вы НАМНОГО более вероятно сохраните / обновите что-либо, чем отмените некоторые изменения, поэтому лучше, если постоянное / обновление происходит автоматически (без дополнительного кода) и вам нужно явно отменить.

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