12

Play Framework 2 と Ebean を使用しています。ユーザーがフォームを送信してデータベース内の既存のオブジェクトを編集する場合、null 値は保存されません。これは、フォームにないフィールドがnullで上書きされるのを防ぐためだと思います。しかし、必要に応じて、フォームのフィールドを null に設定するにはどうすればよいでしょうか?

たとえば、ユーザーがEventオブジェクトを編集します。 Event.date1/1/13 です。ユーザーは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のプロパティはアンロードされていると見なされるため、nullにすべきではない偶発的なnullプロパティを防ぐために、それらは除外されます。

Dateこのため、Ebean (および他のフィールド)をEbeanに戻すのnullは...難しいです:)。前回同じことをしなければならなかったとき(元に戻すDate)、2番目のクエリを使用して... Date event.update(Object o))をnullにしました:

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より新しいものを選択する)、日付を非常に「古い」値に設定するだけで、これもうまくいくはずです。この場合、オブジェクトを1回だけ更新します。

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 に答える