2013-02-10 5 views
12

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

たとえば、ユーザはEventオブジェクトを編集します。 Event.dateは1/1/13です。ユーザーはフォームのEvent.dateフィールドを空に設定し、フォームを送信します。デバッガのEvent.dateを調べると、その値がnullであることが示されます。私はEventを保存します。データベースのEventを見ると、その値は1/1/13です。

編集:これには方法があるようです。唯一の問題は、ネストされたエンティティでは機能しないことです。これに対する解決策はありますか? Ebeanで

update(Object bean,Set<String> properties) 
+0

(私はEbean ORMの著者だ) - この質問は、古いものと古い反対であることだけ注意をEbeanのバージョン。現在の "ステートレスな更新"の動作は、プロパティに対してnullを設定すると、そのプロパティが更新されることを含める必要があるため、nullの値を含むプロパティセットに対して期待通りに動作するはずです。 –

答えて

4

Null性質はそれらがちょうど除外されているので、ゼロにすべきではない偶然のゼロ化プロパティを防ぐために、無負荷と考えられています。

この理由から、Date(およびその他のフィールド)からnullまでは、Ebeanは...ハード:)です。一方

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(); 
    } 

} 

、あなたが使用している場合:私は同じことを(Dateを元に戻す)私はDateevent.update(Object o)後に)ゼロに...ちょうど行うために2番目のクエリを使用しなければならなかった最後の時間比較、イベントをフィルタリング(常に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で簡単に行うことができます。

+1

サンダーによる解決策は私にとってはうまくいくようですが、ebean.propertiesを追加する理由はありませんか? – area5one

5

右隣application.confファイルへebean.propertiesファイルを作成して、次の行を追加します。

ebean.defaultUpdateNullProperties=true 
+0

実際に危険ですが、期待どおりに動作します –