2015-09-26 7 views
13

यह कोई फर्क करता है, तो मैं क्या कर सकते हैं:CrudRepository और हाइबरनेट: (सूची <S>) को बचाने बनाम लेनदेन में (इकाई) को बचाने

@Transactional 
public void processData() { 
    List<MyEntity> entities = ....; 
    MyEntityRepository.save(entities); 
} 

बनाम

@Transactional 
public void processData() { 
    List<MyEntity> entities = ....; 
    for (MyEntity entity : entities) { 
     MyEntityRepository.save(entity); 
    } 
} 

क्या संदर्भ में अंतर नहीं है अंतर्निहित प्रश्नों और प्रदर्शन का?

उत्तर

10

SimpleJpaRepository से:

@Transactional 
public <S extends T> List<S> More save(Iterable<S> entities) { 

    List<S> result = new ArrayList<S>(); 

    if (entities == null) { 
     return result; 
    } 

    for (S entity : entities) { 
     result.add(save(entity)); 
    } 

    return result; 
} 

तो, अपने दूसरे व्यवसाय विधि केवल save(Iterable<S> entities) Crud भंडार विधि छाया, इस अर्थ में कि यह सूची iterates और अपनी ओर से save(S) कहता है।

जब तक लेन-देन आपके processData व्यापार विधि से सीमांकन है, कोई वास्तव में प्रदर्शन या प्रश्नों निष्पादित में एक फर्क है।

+0

यदि मेरी सूची में एक ही प्राथमिक कुंजी के साथ कई इकाइयां हैं और फिर मैं 'सेव (सूची इकाइयां)' कहता हूं, तो यह बाधा अपवाद देता है। हालांकि, अगर मैं पुन: प्रयास करता हूं (यानी दूसरी व्यावसायिक विधि), तो यह शिकायत नहीं करता है। ऐसा क्यों है? – BPm

+0

दिलचस्प। मेरा अनुमान है कि किसी भी तरह '@ लेनदेन '' processData() 'के लिए लागू नहीं होता है, इसलिए दूसरे संस्करण में प्रत्येक पुनरावृत्ति अपने स्वयं के लेनदेन संबंधी संदर्भ में चलता है, इस प्रकार सफल होता है। –

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