2014-04-19 6 views
8

मेरे पास कुछ ऑब्जेक्ट्स हैं जिन्हें मैं हटा नहीं सकता हूं, और इसके बजाय 'हटाए गए' नामक एक सामान्य फ़ील्ड को अपडेट करना होगा। मैंने there पढ़ा है कि मैं #{#entityName} का उपयोग कर जेनेरिक क्वेरी लिख सकता हूं। कारण है कि मैं इस तरह CrudRepository#delete(…) विधि ओवरराइड करने की कोशिश की:स्प्रिंग डेटा क्रूड रिपोजिटरी पर एक डिलीट विधि को ओवरराइड कैसे करें?

public interface DeleteableRepository<T, ID extends Serializable> extends CrudRepository<T,ID>{ 

    @Override 
    @Query("UPDATE #{#entityName} x set x.deleted = 1 where x.id = ?1") 
    public void delete(ID id); 
} 

लेकिन मैं एक इकाई परीक्षण है कि मुझे गलत पता चलता है!

@Test 
public void testDelete() { 

    SomeDeleteableObject sdo = new SomeDeletableObject(); 
    sdo = getDeleteableRepository().create(sdo); 

    Assert.assertNotNull(sdo); 
    Assert.assertNotNull(sdo.getId()); 
    Assert.assertFalse(sdo.isDeleted()); 
    getDeleteableRepository().delete(sdo); 

    sdo = getDeleteableRepository().findOne(sdo.getId()); 
    //Fails here 

} 

क्या CrudRepository विधियों को ओवरराइड करना संभव नहीं है?

+1

आप डिलीवरी रिपोजिटरी व्यवहार को संशोधित क्यों करना चाहते हैं और अपनी सेवा परत में इस स्थिति को संभाल नहीं सकते हैं? – gipinani

+2

क्योंकि अगर मैं इसे रिपोजिटरी लेयर पर संभाल सकता हूं तो मुझे अतिरिक्त सेवाओं या दास को लागू करने की आवश्यकता नहीं है। –

उत्तर

5

प्रश्नों को संशोधित करने के लिए आपको विधि में @Modifying जोड़ने की आवश्यकता है।

हो सुनिश्चित करें कि आप दृष्टिकोण आपके द्वारा चुने गए के साइड इफेक्ट के बारे में पता कर रहे हैं:

  • निष्पादित एक जोड़ तोड़ क्वेरी काफी सभी EntityManager कैश को दरकिनार कर रहा है। इस प्रकार findOne(…)EntityManager को पहले ही लोड कर चुके मामले में हटाए जाने वाले ऑब्जेक्ट का पुराना उदाहरण वापस/वापस कर देगा। इसे रोकने के लिए, clearAutomatically@Modifying से true पर ध्वज सेट करें, लेकिन ध्यान रखें कि इससे सभी लंबित परिवर्तन मिटा दिए जाएंगे।
  • क्वेरी आधारित डेटा मैनिपुलेशन नहीं लाइफसाइक्ल कॉलबैक ट्रिगर किया जाएगा और नहीं कैस्केड दृढ़ता संदर्भ के स्तर पर ट्रिगर किए जाएंगे। इसका मतलब है, @PreUpdate ईवेंट सुनकर इकाई श्रोताओं को सूचित नहीं किया जाएगा। इसके अलावा किसी भी कैस्केड ऑपरेशंस
संबंधित मुद्दे