Как мне сказать 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.

Другие вопросы по тегам