Ответ 1
Создайте файл ebean.properties
рядом с файлом application.conf
и добавьте в него следующую строку:
ebean.defaultUpdateNullProperties=true
Я использую 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)
Создайте файл 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.