2013-02-10 9 views
12

Utilizzo Play Framework 2 ed Ebean. Quando un utente invia un modulo per modificare un oggetto esistente nel database, non salva valori nulli. Immagino che questo sia per evitare di sovrascrivere i campi che non sono nel formato con null. Ma come posso lasciarli impostare campi nel formato a null se necessario?Come posso comunicare a Play Framework 2 e Ebean di salvare campi null?

Ad esempio, l'utente modifica un oggetto Event. Event.date è 1/1/13. L'utente imposta il campo Event.date nel modulo per svuotare e invia il modulo. L'ispezione di Event.date nel debugger mostra che il suo valore è nullo. Salvo lo Event. Se guardo lo Event nel database, il suo valore è ancora 1/1/13.

Modifica: Sembra che ci sia un metodo per questo. L'unico problema è che non funziona su entità nidificate. Qualche soluzione per questo?

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

(io sono l'autore di Ebean ORM) - Solo una nota che tale questione è vecchio e contro un vecchio versione di Ebean. Il comportamento corrente per "aggiornamenti stateless" è che l'impostazione di un valore nullo in una proprietà deve includere l'aggiornamento, quindi semplicemente old update() dovrebbe funzionare come previsto per le proprietà impostate, compresi i valori nulli. –

risposta

4

Null proprietà a Ebean sono considerati come scaricato, in modo da evitare accidentali proprietà azzeramento che non deve essere annullato, sono solo esclusi.

A causa di questo ripristino Date (e altri campi) a null in Ebean è ... difficile :). L'ultima volta in cui ho dovuto fare la stessa cosa (ripristinare Date) ho usato seconda query di fare proprio ... l'azzeramento del Date (dopoevent.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(); 
    } 

} 

D'altra parte, se si utilizza confronto, per filtrare gli eventi (selezionando sempre più recenti di X), puoi semplicemente impostare la data su un valore molto 'vecchio', che dovrebbe anche fare il trucco. In questo caso aggiornerai l'oggetto solo una volta.

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 questo caso nel vostro modulo HTML è necessario cancellare il valore di campo del form (o semplicemente inviare ogni data momento come 0001-01-01), ma può essere fatto facilmente anche con JavaScript.

+1

La soluzione di Thunder sembra funzionare per me, c'è qualche ragione per aggiungere ebean.properties non è una buona idea? – area5one

5

Creare un file ebean.properties proprio accanto al file application.conf e aggiungere questa riga a esso:

ebean.defaultUpdateNullProperties=true 
+0

pericoloso, ma funziona come previsto –

Problemi correlati