2013-02-10 7 views
12

Ich verwende Play Framework 2 und Ebean. Wenn ein Benutzer ein Formular zum Bearbeiten eines vorhandenen Objekts in der Datenbank sendet, werden keine Nullwerte gespeichert. Ich schätze das ist, um das Überschreiben von Feldern zu verhindern, die nicht in der Form mit Null sind. Aber wie kann ich zulassen, dass sie Felder im Formular auf null setzen, wenn sie müssen?Wie kann ich Play Framework 2 und Ebean das Speichern von Nullfeldern mitteilen?

Zum Beispiel bearbeitet der Benutzer ein Event Objekt. Event.date ist 1/1/13. Der Benutzer setzt das Feld Event.date im Formular auf leer und übergibt das Formular. Wenn Sie im Debugger Event.date überprüfen, wird der Wert als null angezeigt. Ich speichere die Event. Wenn ich auf die Event in der Datenbank schaue, ist sein Wert immer 1/1/13.

Edit: Es scheint, dass es eine Methode dafür gibt. Das einzige Problem ist, dass es bei verschachtelten Entitäten nicht funktioniert. Irgendwelche Lösungen dafür?

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

(ich bin der Autor Ebean ORM) - Nur eine Notiz, dass diese Frage ist alt und gegen eine alte Version von Ebean. Das aktuelle Verhalten für "zustandslose Updates" besteht darin, dass das Setzen einer Null für eine Eigenschaft das Update einschließen sollte - also sollte nur das alte update() wie erwartet für Eigenschaften funktionieren, die Nullwerte enthalten. –

Antwort

4

Null Eigenschaften in Ebean gilt als unbelastet, so versehentliche nulling Eigenschaften zu verhindern, die auf Null gesetzt werden sollte, nicht, sie sind nur ausgeschlossen.

Wegen dieser Rücksetzung Date (und andere Felder) zu null in Ebean ist ... hart :). Die letzte Mal, als ich die gleiche Sache zu tun hatte (zufällt Date) Ich zweite Abfrage verwenden nur zu tun ... die nulling Date (nachevent.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(); 
    } 

} 

Auf der anderen Seite, wenn Sie mit Vergleich, für die Filterung von Ereignissen (immer neueren als X), können Sie nur das Datum auf sehr "alten" Wert einstellen, was auch den Trick tun sollte. In diesem Fall aktualisieren Sie das Objekt nur einmal.

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

In diesem Fall in Ihrem HTML-Formular Sie den Wert des Formulars Feld (oder nur jedes Mal, Datum wie 0001-01-01 senden) löschen müssen, aber es kann leicht auch mit JavaScript durchgeführt werden.

+1

Die Lösung von Thunder scheint für mich zu funktionieren. Gibt es einen Grund, die Eigenschaft ebean.properties hinzuzufügen, ist das keine gute Idee? – area5one

5

Eine ebean.properties Datei direkt neben dem application.conf Datei und fügen Sie diese Zeile hinzu:

ebean.defaultUpdateNullProperties=true 
+0

gefährlich in der Tat, aber funktioniert wie erwartet –