विफल रहता है, तो मैं एक साधारण एप्लिकेशन (स्प्रिंग + हाइबरनेट + पोस्टग्रेएसक्ल डीबी) लिख रहा हूं। मैं सिर्फ नमूना वस्तु बनाने और डीबी में बने रहने की कोशिश कर रहा हूं।स्प्रिंग लेनदेन - पिछले डीबी अपडेट के स्वचालित रोलबैक जब एक डीबी अपडेट
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryVsm" />
</bean>
<bean id="testService" class="com.test.service.TestServiceImpl">
<property name="testDao" ref="testDao"/>
</bean>
<bean id="testDao" class="com.test.dao.TestDaoImpl>
<property name="sessionFactory" ref="sessionFactoryVsm"/>
</bean>
: संदर्भ -
मैं एक साधारण जावा वर्ग मुख्य विधि मैं कहाँ applicationContext भरी हुई है और नीचे
TestService srv = (TestService)factory.getBean("testService");
आवेदन संदर्भ के रूप में सेवा वर्ग के संदर्भ में मिल गया है चलाने टेस्ट सर्विस में मैंने टेस्टडाओ इंजेक्शन दिया है। परीक्षण सेवा विधि में मैंने कर्मचारी वस्तुओं emp1 और emp2 और दो बार कॉल करने के लिए दाओ को कॉल करने के लिए बनाया है।
TestDaoImpl कोड:
public void saveOrUpdate(BaseDomainModel baseObject) {
Session session = null;
try {
session = getHibernateTemplate().getSessionFactory().openSession();
session.saveOrUpdate(baseObject);
session.flush();
} catch (Exception e) {
logger.error("Generic DAO:saveOrUpdate::" + e);
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
emp1 भी असफल चाहिए जब emp2 अद्यतन विफल रहता है। मैं उसको कैसे करू। अग्रिम
अपडेट किया गया में सलाह कृपया
धन्यवाद:
धन्यवाद नंदा। मैंने घोषणात्मक लेनदेन की कोशिश की। लेकिन यह काम नहीं कर रहा है। emp1 जारी रहता है और पीछे नहीं घुमाया जाता है दूसरा द्वितीय कॉल विफल रहता है। मैंने विधि में लेनदेन सलाह जोड़ दी है।
अगर लेन-देन सलाह या लागू नहीं होती है मैं प्रचार करने के लिए "NOT_SUPPORTED" में बदल परीक्षण करने के लिए। लेकिन अभी भी emp1 जारी रहता है। उम्मीद है कि हमें ट्रांजैक्शन नहीं मिला होना चाहिए अपवाद का प्रकार। कृपया सलाह दें ।
UPDATED
@seanizer - अद्यतन के लिए धन्यवाद। मैंने
@ ट्रांज़ेक्शनल (प्रचार = प्रचार .NOT_SUPPORTED) सार्वजनिक शून्य saveEmp (कर्मचारी emp) उस सेवा विधि में जोड़ने का भी प्रयास किया है। लेकिन यह काम नहीं किया। इसके अलावा संग्रह को पुन: व्यवस्थित करना केवल तभी अच्छा होता है जब मुझे एक दाओ को फोन करने की आवश्यकता हो। यदि मुझे obj1 और obj2 को बनाए रखने के लिए दो अलग-अलग दाओ को कॉल करना है- इससे मदद नहीं मिल सकती है। यह जांचने के लिए कि लेनदेन लागू हो रहा है या नहीं, मुझे @ ट्रान्सएक्शनल (प्रचार = प्रचार .NOT_SUPPORTED) प्राप्त होता है। लेकिन अभी भी obj1 जारी रहा है। मुझे संदेह है कि अगर XML कॉन्फ़िगरेशन/एनोटेशन दिया गया है तो सही है।
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryVsm" />
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="saveEmp" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="testServiceOperation" expression="execution(*com.test.service.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="testServiceOperation"/>
</aop:config>
मैं transactionManager के लिए org.springframework.orm.hibernate3.HibernateTransactionManager उपयोग कर रहा हूँ देखें। क्या ये सही है ?
मैं अपने अपवाद वर्ग बनाया है myRuntimeExp RuntimeException से विस्तार और सेवा विधि के लिए दाव विधि से एक ही फेंक अपडेट किया गया। लेकिन अभी भी रोलबैक नहीं हो रहा है।मुझे संदेह है कि अगर मैंने applnContext.xml में कॉन्फ़िगरेशन सही तरीके से दिए हैं। क्या कोई मेरी मदद कर सकता है कि यह जांचने के लिए कि क्या लेनदेन सलाह/एनोटेशन विधि पर लागू किया जा रहा है या नहीं?
मैं
session = getHibernateTemplate().getSessionFactory().openSession();
उपयोग कर रहा था लेकिन यह वर्तमान सत्र होना चाहिए और यह ठीक काम कर रहा है: वहाँ एक डिबगिंग मोड में चल रहा है और जाँच
जारी करने की किसी भी तरह से है।
session = getHibernateTemplate().getSessionFactory().getCurrentSession();
क्या वसंत घोषणात्मक लेनदेन इस मामले में सहायता करता है? – Vaandu
हां बेशक, घोषित करें कि दाओ और सेवा स्तर पर लेनदेन की आवश्यकता है। यदि दाओ का पता चलता है कि सेवा ने लेनदेन खोला है, तो यह नए लेनदेन – nanda
बनाने के बजाय इसका उपयोग करेगा, मैं असहमत हूं, सेवा विधियों पर लेनदेन की आवश्यकता होनी चाहिए, न कि दाओ विधियों। इस तरह एक सेवा कॉल परमाणु हो सकता है भले ही यह कई दाओ विधियों का उपयोग करता है (हाँ, मुझे पता है कि आप मौजूदा लेनदेन में शामिल होने से भी इसे प्राप्त कर सकते हैं, लेकिन मैं परतों का एक साफ अलगाव पसंद करता हूं) –