jpa जब EntityManager प्रतिबद्ध करता है?



jersey ejb-3.1 (1)

मेरे पास निम्न सेवा है ...

@Stateless
@LocalBean
public class RandomService {

    @EJB RandomString stringTokenizer;

    @PersistenceContext
    EntityManager em;

    public String generate(Actions action)
    {
        Token token = new Token();
        token.setAction(action);
        token.setExpiry(new Date());
        token.setToken(stringTokenizer.randomize());

        em.persist(token);
        //em.flush();

        return String.format("%010d", token.getId()) + token.getToken();
    }
}

अगर मैं em.flush () को नहीं डालता तो लाइन टोकन.गेटआईडी () शून्य (डीबी जनरेटेड अनुक्रम का उपयोग करना) वापस लौटाएगा हालांकि मुझे पता है कि मैं कॉलिंग सेवा के लिए स्ट्रिंग के बदले आईडी को सेट कर रहा हूं। इसलिए ऐसा लगता है कि ईएम फ्लश करता है जब सेवा टोकन ऑब्जेक्ट देती है, लेकिन जब मैं स्ट्रिंग डालता हूं। फ्लश डालने से मुझे क्या जरूरत है, हालांकि यह सही है?


कमाने के साथ फ्लशिंग को भ्रमित न करें flush() दौरान जेपीए प्रदाता शारीरिक रूप से डाटाबेस में एसक्यूएल उत्पन्न करता है और आपके मामले में, जनरेटेड आईडी को पढ़ता है और इसे बीन में भरता है। ध्यान दें कि आपको हमेशा लौटाए गए तत्व का उपयोग करने के लिए मूल persist() बजाए गए) के बजाय का उपयोग करना चाहिए:

token = em.persist(token);

दूसरी तरफ, प्रतिबद्ध, डेटाबेस प्रतिबद्ध करता है जाहिर है यह पहले flush() ट्रिगर करेगा flush() , लेकिन यह आपकी यहां मदद नहीं करेगा। लेकिन जब आप पूछ रहे हैं - ईजेबी में प्रत्येक विधि डिफ़ॉल्ट रूप से लेनदेन है इसका अर्थ है लेन-देन तब होता है जब आप स्टैक पर पहले ईजेबी छोड़ देते हैं: अगर आप किसी दूसरे ईजेबी को कॉल करते हैं, तो कॉलली डिफ़ॉल्ट रूप से कॉलर लेन-देन में मिलती है (देखें: लेनदेन प्रचारा व्यवहार )।

यह भी ध्यान रखें कि जब नियमों को flush() थोड़ा जटिल होता है, क्योंकि हर प्रदाता इस तरह से देर से और बैचों में ऐसा करने की कोशिश करता है।





entitymanager