2017-01-23 2 views
0

Project использует рамки игры 1.3.3 У меня есть такой контроллер:рамки игры 1.3.3 и спящий режим кэш

public static void save(Item item) { 
    if (item.id != null) { //It means that item is not new, it is being edited 
     Item existingOldItem = Item.findById(item.id); 
     //Here I should have an old version of an item as "existingOldItem" 
     //and new one coming from http request as "item" 
    } 

Но проблема пункт и existingOldItem очень идентичны. Item.findById не возвращает мне старый элемент из базы данных, но возвращает новый элемент из http-запроса (то же самое с JPA.em(). CreateQuery). Я полагаю, что play framework отправляет новый элемент в кеш, а findById возвращает элемент из кеша, а не из базы данных. Пожалуйста, может кто-нибудь объяснить мне логику этого и способы решения проблемы.

ответ

3

проблема вещь и существующий OldItem очень идентичны. Item.findById не возвращает мне старый объект из базы данных

Это ожидаемое поведение. Item.findById() возвращает старый элемент, измененный клиентом HTTP. Взгляните на JPA object binding из Play! документацию, чтобы увидеть шаблон вызова.

Пожалуйста, может кто-нибудь объяснить мне логику этого ...

Короче говоря, клиент HTTP, как ожидается, обеспечит идентификатор записи элемента и его новые значения свойств в HTTP-запросе , Играть! устанавливает параметр item , готовый к сохранению, поиск элемента в базе данных и изменение его свойств в соответствии с параметрами POST. Поэтому у вас не должно быть «старого» и «нового» элементов, вы должны просто иметь объект «item» , который может быть старым или новым, в зависимости от того, был ли найден ID, предоставленный HTTP-клиентом в базы данных. Все действия вашего контроллера должны состоять в том, чтобы вызвать item.save().

Магия находится в JPAPlugin.bind. Как вы уже догадались, сначала он ищет объект в базе данных. Если он находит объект, он вызывает Item.edit() с использованием этого объекта. Это также является волшебным, и реализация по умолчанию задает все свойства элемента, для которых есть соответствующие параметры HTTP.

... и способы решения проблемы.

Я не уверен, что вы считаете, что проблема будет, но если вы хотите, старый и новый элемент, то клиент не должен обеспечивать item.id параметр. Если вам не нравится эта игра! копается в вашей базе данных, чтобы создать экземпляр параметра item, тогда вы можете предоставить встраиваемое связующее сообщение или принять действие контроллера с похожим классом POJO вместо класса JPA.

+0

Спасибо! Это обычное поведение любой веб-структуры с использованием JPA или это просто игра! вещь? –

+0

Это игра! конкретный. Если другие веб-фреймворки делают то же самое, это по совпадению. Я был бы удивлен, если любая другая структура сделает это, потому что item.save() - это Play! но не так, как обычно работают объекты JPA. Если какая-либо другая инфраструктура изменила объект JPA в памяти, Hibernate может сбросить изменения в базе данных, не давая логике приложения возможность отклонить их. Но в Play !, логика приложения должна вызвать save() для сброса изменений. –

Смежные вопросы