2013-02-10 17 views
12

Play Framework 2 ve Ebean kullanıyorum. Bir kullanıcı veritabanındaki mevcut bir nesneyi düzenlemek için bir form gönderdiğinde, boş değerleri kaydetmez. Sanırım bu, formda null olmayan alanların üzerine yazılmasını engellemektir. Ancak, form alanlarını neye ihtiyaç duyarlarsa boş bırakacaklarına nasıl izin verebilirim? Örneğin, kullanıcı Event nesnesini düzenler. Event.date, 1/1/13. Kullanıcı formu doldurmak ve göndermek için formdaki Event.date alanını ayarlar. Hata ayıklayıcısında Event.date'un incelenmesi, değerinin boş olduğunu gösterir. Event'u kaydediyorum. Veritabanındaki Event'a bakarsam, değeri hala 1/1/13'dür.Play Framework 2 ve Ebean'a boş alanları kaydetmek için nasıl söylerim?

Düzenleme: Bunun için bir yöntem var gibi görünüyor. Tek sorun, yuvalanmış varlıklar üzerinde çalışmadığıdır. Bunun için herhangi bir çözüm var mı? böylece nulled edilmemelidir kazara sıfırlama özelliklerini önlemek için, yüksüz olarak Ebean içinde

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

(I Ebean ORM yazarı olduğum) - Bu soru eski olduğunu Sadece bir not ve eski bir karşı Ebean sürümü. "Durum bilgisi olmayan güncelleştirmeler" in geçerli davranışı, bir özelliğe karşı bir boş değerinin, bu güncelleştirmeyi içermesi gerektiğini içermesidir. Bu nedenle, yalnızca eski eski güncelleştirme(), boş değerler dahil olmak üzere özellikler için beklenen şekilde çalışmalıdır. –

cevap

4

Null özellikleri olarak kabul edilir, onlar sadece dışındadır.

Bu, Ebean'da Date (ve diğer alanların) null'a geri döndürülmesinden dolayı ... zor :). Öte yandan

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

} 

, kullandığınız takdirde: Ben de aynı şeyi (Date dönmek) Ben Date (event.update(Object o) sonra) battal ... sadece yapmak için ikinci sorguyu kullanılan yapmak zorunda son kez Karşılaştırma, olayları filtrelemek için (her zaman X'ten daha yeni birini seçerek), tarihi sadece 'eski' değere ayarlayabilir ve bu da hile yapmalıdır. Bu durumda nesneyi yalnızca bir kez güncelleyeceksiniz. HTML'nize Bu durumda

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

ancak bile JavaScript ile kolayca yapılabilir, siz (ya da sadece 0001-01-01 gibi her zaman tarih gönderme) formun alanın değerini temizlemek gerekir oluştururlar.

+1

Thunder'ın çözümü benim için işe yarıyor gibi görünüyor, ebean.properties eklemek iyi bir fikir değil mi? – area5one

5

hemen yanında application.conf dosyaya bir ebean.properties dosyası oluşturun ve ona bu satırı ekleyin:

ebean.defaultUpdateNullProperties=true 
+0

tehlikeli, ancak beklendiği gibi çalışıyor –

İlgili konular