Как мне сказать Play Framework 2 и Ebean сохранить пустые поля?
Я использую Play Framework 2 и Ebean. Когда пользователь отправляет форму для редактирования существующего объекта в базе данных, он не сохраняет нулевые значения. Я предполагаю, что это предотвращает перезапись полей, которые не имеют нулевую форму. Но как я могу позволить им устанавливать поля в форме на нуль, если это необходимо?
Например, пользователь редактирует Event
объект. Event.date
1/1/13. Пользователь устанавливает Event.date
поле в форме, чтобы очистить и отправляет форму. инспектирование Event.date
в отладчике показывает, что его значение равно нулю. Я спасаю Event
, Если я посмотрю на Event
в базе данных его значение по-прежнему 1/1/13.
Изменить: кажется, есть способ для этого. Единственная проблема - это не работает на вложенных объектах. Какие-нибудь решения для этого?
update(Object bean,Set<String> properties)
2 ответа
Создать ebean.properties
файл прямо рядом с application.conf
файл и добавьте в него эту строку:
ebean.defaultUpdateNullProperties=true
Null
свойства в Ebean считаются незагруженными, поэтому для предотвращения случайного обнуления свойств, которые не следует обнулять, их просто исключают.
Из-за этого Date
(и другие поля) для null
в Ebean это... трудно:). В прошлый раз, когда я должен был сделать то же самое Date
) Я использовал второй запрос, чтобы просто... обнулить Date
(после event.update(Object o)
):
public static Result updateEvent(){
Form<Event> eventForm = form(Event.class).bindFromRequest();
// do some validation if required...
Event event = eventForm.get();
event.update(event.id);
if (eventForm.get().date == null){
Ebean
.createUpdate(Event.class, "UPDATE event SET date=null where id=:id")
.setParameter("id", page.id).execute();
}
}
С другой стороны, если вы используете сравнение, для фильтрации событий (всегда выбирая новее, чем X), вы можете просто установить дату в очень "старое" значение, что также должно помочь. В этом случае вы обновите объект только один раз.
private static final Date VERY_OLD_DATE = new GregorianCalendar(1, 0, 1).getTime();
public static Result updateEvent(){
Form<Event> eventForm = form(Event.class).bindFromRequest();
Event event = eventForm.get();
if (eventForm.get().date == null){
event.date = VERY_OLD_DATE;
}
event.update(event.id);
}
В этом случае в вашей HTML-форме вам нужно будет очистить значение поля формы (или просто отправлять каждый раз дату, например 0001-01-01
), однако это легко сделать даже с помощью JavaScript.