2013-02-10 70 views
12

मैं प्ले फ्रेमवर्क 2 और ईबीन का उपयोग कर रहा हूं। जब कोई उपयोगकर्ता डेटाबेस में किसी मौजूदा ऑब्जेक्ट को संपादित करने के लिए कोई फ़ॉर्म सबमिट करता है, तो यह शून्य मानों को सहेजता नहीं है। मुझे लगता है कि यह उन ओवरराइटिंग फ़ील्ड को रोकने के लिए है जो नल के रूप में नहीं हैं। लेकिन अगर उन्हें जरूरत पड़ती है तो मैं उन्हें फॉर्म में फ़ील्ड को शून्य में कैसे सेट कर सकता हूं?शून्य फ़ील्ड को बचाने के लिए मैं प्ले फ्रेमवर्क 2 और ईबीन कैसे कहूं?

उदाहरण के लिए, उपयोगकर्ता Event ऑब्जेक्ट संपादित करता है। Event.date 1/1/13 है। उपयोगकर्ता Event.date फ़ील्ड को खाली करने और फ़ॉर्म को सबमिट करने के लिए फॉर्म में सेट करता है। डीबगर में Event.date का निरीक्षण करने से पता चलता है कि इसका मान शून्य है। मैं Event बचाता हूं। यदि मैं डेटाबेस में Event देखता हूं, तो इसका मान अभी भी 1/1/13 है।

संपादित करें: ऐसा लगता है कि इसके लिए एक विधि है। एकमात्र समस्या यह है कि यह नेस्टेड इकाइयों पर काम नहीं करती है। इसके लिए कोई समाधान? Ebean में

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

(मैं Ebean ORM के लेखक हूँ) - बस एक ध्यान दें कि यह सवाल पुराना है और एक पुराने के खिलाफ ईबीन का संस्करण। "स्टेटलेस अपडेट्स" के लिए वर्तमान व्यवहार यह है कि किसी संपत्ति के खिलाफ शून्य स्थापित करने में यह अद्यतन होना चाहिए - इसलिए केवल सादे पुराने अपडेट() को शून्य मानों सहित गुण सेट के लिए अपेक्षित कार्य करना चाहिए। –

उत्तर

4

Null गुण, के रूप में उतार दिया ताकि आकस्मिक nulling गुण है कि nulled नहीं किया जाना चाहिए को रोकने के लिए माना जाता है, वे सिर्फ बाहर रखा गया है।

इस वापसी के कारण Date (और अन्य फ़ील्ड) null ईबेन में ... कठिन :) है। पिछली बार जब मैं एक ही बात (वापस लौटने Date) मैं दूसरे प्रश्न का इस्तेमाल किया बस करने के लिए ... nulling Date ( के बाद event.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(); 
    } 

} 

दूसरी ओर, आप उपयोग कर रहे हैं तुलना, घटनाओं को फ़िल्टर करने के लिए (हमेशा एक्स से नए का चयन), आप बस तारीख को बहुत पुराने 'मूल्य' पर सेट कर सकते हैं, जिसे चाल भी करना चाहिए। इस मामले में आप केवल एक बार ऑब्जेक्ट अपडेट करेंगे।

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 की तरह हर बार तारीख भेज) प्रपत्र की फ़ील्ड का मान स्पष्ट करने की आवश्यकता होगी, लेकिन यह भी जावास्क्रिप्ट के साथ आसानी से किया जा सकता है।

+1

थंडर का समाधान मेरे लिए काम करता प्रतीत होता है, क्या ebean.properties जोड़ने का कोई कारण नहीं है? – area5one

5

सही application.conf फ़ाइल के आगे एक ebean.properties फ़ाइल बनाएं और उसे करने के लिए इस पंक्ति जोड़ें:

ebean.defaultUpdateNullProperties=true 
+0

वास्तव में खतरनाक है लेकिन उम्मीद के अनुसार काम करता है –