2015-08-28 8 views
13

मैं एक अजीब मुद्दे पर काम कर रहा हूं, मैं एकीकरण परीक्षण कर रहा था, जो मेरे नियंत्रक को डेटाबेस से ऑब्जेक्ट प्राप्त करने के लिए बुला रहा था जो मौजूद नहीं है।एक वसंत डेटा भंडार पर getOne (...) क्यों EntityNotFoundException फेंक नहीं देता है?

public Optional<T> get(Long id) { 

    try { 
    return Optional.ofNullable(repository.getOne(id)); 
    } catch(EntityNotFoundException e) { 
    return Optional.empty(); 
    } 
} 

जब getOne(…) कुछ भी नहीं मिल पाई है, मैं एक EntityNotFoundException लेकिन वास्तव में कुछ भी नहीं उम्मीद कर रहा था। अगर मैं अपना परिणाम देखता हूं तो मैं देख सकता हूं कि मेरे पास हैंडलर लिंक के साथ एक खाली इकाई है "EntityNotFoundException फेंक दिया" लेकिन हम पकड़ में नहीं जाते हैं और मैं इस अजीब इकाई का एक वैकल्पिक विकल्प देता हूं।

मैं इस व्यवहार को समझ नहीं सकता।

+0

आप एक उत्साह की अपेक्षा क्यों करते हैं? जावाडोक अपवाद के बारे में नहीं कहता है। – Jens

+0

यह क्लासिक जेपीए व्यवहार है जब आप किसी मौजूदा डेटा पर getOne() को कॉल करते हैं। – Seb

+0

इसके अलावा मैं देख सकता हूं कि यह अपवाद फेंक दिया गया है लेकिन वसंत डेटा द्वारा किसी भी तरह से संभालता है? – Seb

उत्तर

18

यह जेपीए काम करने के लिए EntityManager.getReference(…) निर्दिष्ट करता है। यह एक प्रॉक्सी वापस करना है जो या तो किसी संपत्ति की पहली पहुंच पर वापस आने के लिए ऑब्जेक्ट को हल करेगा या अंततः निहित अपवाद फेंक देगा।

इसके आसपास काम करने का सबसे आसान तरीका यह है कि इस Optional.ofNullable(repository.findOne(…)) की तरह findOne(…) का उपयोग करें। findOne(…) कोई परिणाम नहीं मिलने पर null वापस करेगा।

इसे हल करने का एक और उन्नत तरीका भंडार वापसी Optional उदाहरण सीधे करना है। का उपयोग find… -methods के लिए रिटर्न प्रकार के रूप में एक कस्टम बेस रिपोजिटरी इंटरफेस बनाकर हासिल किया जा सकता है।

interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> { 

    Optional<T> findOne(ID id); 

    // declare additional methods if needed 
} 

interface YourRepository extends BaseRepository<DomainClass, Long> { … } 

Spring Data examples repository में इस का एक पूरा उदाहरण का पता लगाएं।

+0

एक अच्छा विचार की तरह लग रहा है! मैं इसे से दूर करने की कोशिश करूंगा लेकिन ... प्रदर्शन के बारे में क्या है, क्या आपको एक के रूप में अच्छा लगता है? – Seb

+2

वास्तव में एक अंतर है क्योंकि 'getOne (...) 'ऑब्जेक्ट को तुरंत पूरा नहीं करता है जबकि' findOne (...)' करता है। पूर्व का नकारात्मक पक्ष यह है कि यह लुकअप में विफलता में भी देरी करता है, जो आपको यहां काटता है। साथ ही, 'findOne (...)' किसी एंटीटी मैनेजर 'में पहले स्तर के कैश को किसी विशेष सत्र में दबाएगा, तो आप डेटाबेस को दो बार नहीं दबाएंगे। यदि यह वास्तव में एक मुद्दा बन जाता है तो आप स्पष्ट रूप से कैश को प्लग करना चाहते हैं लेकिन जब तक माप वास्तव में दिखाता है, तब तक मैं देरी करता हूं, एक समस्या है। –

+2

बहुत स्पष्ट, आपकी मदद के लिए धन्यवाद! – Seb

संबंधित मुद्दे