Подтвердить что ты не робот

Как сообщить Play Framework 2 и Ebean, чтобы сохранить нулевые поля?

Я использую Play Framework 2 и Ebean. Когда пользователь отправляет форму для редактирования существующего объекта в базе данных, он не сохраняет нулевые значения. Я предполагаю, что это предотвращает переписывание полей, которые не имеют форму с нулем. Но как я могу позволить им устанавливать поля в форме равными нулю, если им нужно?

Например, пользователь редактирует объект Event. Event.date - 1/1/13. Пользователь устанавливает поле Event.date в форме для пустого и представляет форму. Проверка Event.date в отладчике показывает, что его значение равно null. Я сохраняю Event. Если я посмотрю на Event в базе данных, его значение останется на 1/1/13.

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

update(Object bean,Set<String> properties)
4b9b3361

Ответ 1

Создайте файл ebean.properties рядом с файлом application.conf и добавьте в него следующую строку:

ebean.defaultUpdateNullProperties=true

Ответ 2

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.