2009-11-26 19 views
22

में है जब मैं फोन:हाइबरनेट जेपीए और स्प्रिंग javax.persistence.TransactionRequiredException: कोई लेनदेन प्रगति

entityManager.flush() 

मैं अपवाद शीर्षक में उल्लेख मिलता है।

मैं हाइबरनेट जेपीए का उपयोग कर रहा हूं।

+0

अपना वेब दिखाएं।एक्सएमएल, और आपकी सर्वलेट फाइलें –

उत्तर

4

सुनिश्चित करें कि यह कथन निष्पादित होने पर आपके पास सक्रिय लेनदेन है। यदि आप जेपीए का उपयोग कर रहे हैं EntityManager.getTransaction()। शुरू करें()। यह माना जा रहा है कि आप जेटीए लेनदेन के दायरे के बाहर जेपीए का उपयोग कर रहे हैं।

यदि आप जेटीए समर्थन के साथ एक कंटेनर के अंदर एप्लिकेशन चला रहे हैं तो आप लेनदेन प्रबंधित करने के लिए जेटीए उपयोगकर्ता ट्रांज़ेक्शन का भी उपयोग कर सकते हैं।

1

कृपया सुनिश्चित करें कि आपकी हैंडलर विधि घोषित किया जाता है

@Transactional 
@RequestMapping('/test') 
public String doTest() { 
    // do your stuff here 
    return 'testview'; 
} 
+0

अच्छी पकड़ ब्रो ..! –

0

सुनिश्चित करें कि आपके वसंत विन्यास निम्न पंक्ति शामिल है public के रूप में करते हैं:

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />

mode या तो प्रॉक्सी हो सकता या पहलू और transaction-manager को आपके लेनदेन को इंगित करना है प्रबंधक रहा

0

वसंत 3.0.0/3.0.3 का उपयोग कर मेरे साथ ही हो रहा था। डेटा को MySQL में JUnit से जारी रखा गया था लेकिन टॉमकैट सर्वर से नहीं। जेटीए के लिए मैंने RESOURCE_LOCAL पर इतना काम करने के बाद छोड़ दिया।

यह मेरे लिए काम किया http://erich.soomsam.net/2007/04/24/spring-jpa-and-jta-with-hibernate-and-jotm/ यह जेटीए का उपयोग करता है और जेट पर निर्भर करता है।

0

JBoss 4.0 और हाइबरनेट के लिए, मैं अपने EntityManagerFactoryBean परिभाषा करने के लिए कुछ लेन-देन प्रबंधक गुण जोड़कर इस समस्या तय:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="xaDs" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory 
      </prop> 
      <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup 
      </prop> 
     </props> 
    </property> 

मैं soluton on this message board thread पाया। स्प्रिंग एक बग है और @Transactional टिप्पणी के साथ लेन-देन नहीं बनाए रख सकते है, तो एक ही कक्षा साधन के लिए @Service एनोटेशन है:

14

इस समस्या को अपने आप का सामना करके उसका समाधान मैं अंत में इसके लिए एक कारण पाया प्राप्त करने की कोशिश कुछ ही घंटों के खर्च करने के बाद autowiring के।

एक बार @Service एनोटेशन प्रश्न में सेवा कक्षा से निकाल दिया गया था, और एक उचित सेम एक्सएमएल config में घोषित किया गया था:

<bean id="myService" class="com.example.myapp.service.MyServiceImpl" /> 

समस्या चला गया है।

अधिक जानकारी के लिए यह JIRA bug देखें।

+4

अच्छी तरह से यह कह रहा है कि यह एक बग पूरी तरह से सही नहीं है, आपके द्वारा दिए गए लिंक ने पहले से ही अच्छा स्पष्टीकरण दिया है कि यह क्यों हो रहा है - सर्विस क्लास को appContext.xml और spring-servlet.xml दोनों में एक बीन के रूप में तत्काल प्राप्त किया जा रहा है। इसे केवल ऐपकॉन्टेक्स्ट.एक्सएमएल में 'बीन' किया जाना चाहिए अन्यथा इसमें लेनदेन का समर्थन नहीं होगा। –

+0

@ हर्षल वाघमारे आपने मेरे नीचे दो बार बचाया। मुझे दो बार एक ही त्रुटि का सामना करना पड़ा और उत्सुकता से आपकी टिप्पणी फिर से ढूंढने की कोशिश कर रहा था: डी। अंत में, hurray। नियंत्रकों को स्कैन करने के लिए सर्वलेट-संदर्भ को बताया .. सब कुछ आकर्षण की तरह काम करता है। – Aubergine

3

मेरे समस्या रास्ते से कोई लेना देना था कि मैं सेटअप मेरे संदर्भ परिभाषा <tx:annotation-driven/> तत्व -

मूल रूप से मैं था लोड समय बुनाई सक्षम (knownley नहीं) है कि <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> पढ़ सकते हैं और बस 2 विशेषता को हटाने के द्वारा - सब कुछ काम किया (हालांकि सिर बैंगिंग के 2 घंटे लग गए)। मेरा मानना ​​है कि 2 तत्व @Configurable sterotype से संबंधित है, लेकिन = अन्य (होशियार) लोगों अंतर & स्पष्टीकरण दें कि एक & अन्य करता है .. आशा है कि यह नहीं है इस में मदद करता है ...

काम कर परिभाषा काम करेगा दे सकते हैं <tx:annotation-driven transaction-manager="transactionManager"/>

0

मैंने निम्नलिखित सब कुछ किया है। मेरी समस्याएं "आयात" टैग के साथ थीं, कई संदर्भ रूट हैं जैसे सर्वलेट-संदर्भ और रूट-संदर्भ जो एक-दूसरे पर निर्भर नहीं हैं। एसटीएस में स्प्रिंग एक्सप्लोरर व्यू के साथ यह स्पष्ट हो जाता है। टोमकैट के लिए कोई जेटीए नहीं।

मेरी सलाह सार्वभौमिक होगी: अपने पर्यावरण पर पालतू क्लिनिक चलाएं, How to run Spring 3.0 PetClinic in tomcat with Hibernate backed JPA या एप्लिकेशन के रू स्टब के साथ उत्पन्न करें और संदर्भ के साथ अपनी कॉन्फ़िगरेशन की तुलना करने का प्रयास करें।

0

मैं अंत में अपने आवेदन-context.xml में

<tx:annotation-driven mode="aspectj" transaction-manager="yourTransactionManager" /> 

जोड़ने

+0

आपका उत्तर इयान के उत्तर के विपरीत है। उन्होंने मोड = "पहलू" पैरामीटर हटा दिया। – Brain

2

सुनिश्चित करें कि आप एक सक्रिय लेनदेन जब इस बयान निष्पादित करता है इस त्रुटि को ठीक कर दिया। यदि आप जेपीए का उपयोग कर रहे हैं EntityManager.getTransaction().begin() का उपयोग करें। यह माना जा रहा है कि आप जेटीए लेनदेन के दायरे के बाहर जेपीए का उपयोग कर रहे हैं।

2

मुझे यह समस्या थी, बस न केवल विधि पर, @Service एनोटेशन के साथ कक्षा में @ ट्रांस्सेक्शन एनोटेशन जोड़ें।

उदाहरण के लिए

:

@Service 
@Transactional 
public class MyService { 

} 
+0

वर्ग के लिए @ ट्रान्सैक्शनल एनोटेशन ने मेरी समस्या हल की। – pablosaraiva

1

वसंत 4.3.1/हाइबरनेट 4.2.21

मेरे विन्यास था कोई हाइबरनेट या वसंत एक्सएमएल दस्तावेजों के साथ 100% जावा कोड (जैसे context.xml, persistence.xml आदि)। यह मुद्दा EntityManagerFactory था, मैं TransactionManager पर जा रहा था, transactionManager विधि में निम्न कॉन्फ़िगरेशन देखें।

@Configuration 
@EnableTransactionManagement 
public class HibernateConfiguration2 { 

@Bean 
public DataSource dataSource() { 
    return ...; // Build a basic datasource 
} 

@Bean 
@Autowired 
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { 
    LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); 
    entityManagerFactory.setDataSource(dataSource); 
    entityManagerFactory.setPackagesToScan("nz.co.mark"); 
    entityManagerFactory.setPersistenceProviderClass(org.hibernate.ejb.HibernatePersistence.class); 

    return entityManagerFactory; 
} 

@Bean 
@Autowired 
public EntityManager entityManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) { 
    EntityManager em = localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory().createEntityManager(); 
    em.setFlushMode(FlushModeType.AUTO); 
    return em; 
} 

@Bean 
@Autowired 
public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) throws Exception { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(emf.getObject()); 
    // The below line would generate javax.persistence.TransactionRequiredException: no transaction is in progress 
    // transactionManager.setEntityManagerFactory(emf.getNativeEntityManagerFactory()); 
    return transactionManager; 
} 
0

मुझे एक ही समस्या थी ... कुछ घंटे बिताए जब तक कि मुझे अंत में कारण नहीं मिला।

<context:component-scan base-package="com.my.package.application" /> 

के बाद: यह कोड की केवल एक पंक्ति है कि मेरे मामले में अपवाद के कारण होता है ...

मेरी MVC-कोर-config.xml में निम्न पंक्ति कारण था इस प्रकार मैं इसे बदल गया है, सब कुछ फिर से काम किया:

<context:component-scan base-package="com.my.package.application.controller" /> 

तो मैं बस अपना @Controller वर्गों के बजाय मेरे सभी आवेदन संकुल की स्कैनिंग लगता है के लिए नेतृत्व @ harshal-waghmare जैसी समस्या his post to another answer में उल्लिखित है।

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