12

我正在使用 Play Framework 2 和 Ebean。当用户提交表单以编辑数据库中的现有对象时,它不会保存空值。我想这是为了防止用 null 覆盖不在表单中的字段。但是,如果他们需要,我怎样才能让他们将表单中的字段设置为 null 呢?

例如,用户编辑一个Event对象。 Event.date是 13 年 1 月 1 日。用户将Event.date表单中的字段设置为空并提交表单。在调试器中检查Event.date显示其值为 null。我保存Event. 如果我查看Event数据库中的 ,它的值仍然是 1/1/13。

编辑:似乎有一种方法。唯一的问题是它不适用于嵌套实体。有什么解决方案吗?

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

2 回答 2

5

ebean.properties在文件旁边创建一个文件application.conf并将此行添加到其中:

ebean.defaultUpdateNullProperties=true
于 2013-11-07T12:09:10.273 回答
4

NullEbean 中的属性被视为已卸载,因此为防止意外将不应为空的属性置空,将它们排除在外。

因为这个在 Ebean 中的恢复Date(和其他领域)null是......很难:)。上次当我不得不做同样的事情(revert 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 也可以轻松完成。

于 2013-02-10T12:38:49.090 回答