2010-03-01 15 views
8

मैं माइस्क्ल और ग्लासफ़िश के साथ हाइबरनेट इकाई प्रबंधक का उपयोग करने का प्रयास कर रहा हूं। मैं निम्न त्रुटि जब एक JTA डेटा स्रोत उपयोग करने का प्रयास हो रही है:हाइबरनेट, माइस्क्ल, ग्लासफ़िश v3, और जेटीए डेटासोर्स

Caused by: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager 
     at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:376) 
     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1367) 
     at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:858) 
     at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:733) 
     ... 37 more 

यहाँ है मैं कैसे कॉन्फ़िगर किया है मेरी persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="myPU" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>jdbc/mysql</jta-data-source> 
    <class>com.my.shared.entity.MyFile</class> 
    <class>com.my.shared.entity.MyRole</class> 
    <class>com.my.shared.entity.MyUser</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
     <property name="hibernate.show.sql" value="true" /> 
    </properties> 

हालांकि, जब मैं एक कॉन्फ़िगर गैर-जेटीए डेटासोर्स, यह ठीक काम करता है

<?xml version="1.0" encoding="UTF-8"?> 
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
     <persistence-unit name="myPU" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <non-jta-data-source>jdbc/mysql</non-jta-data-source> 
     <class>com.my.shared.entity.MyFile</class> 
     <class>com.my.shared.entity.MyRole</class> 
     <class>com.my.shared.entity.MyUser</class> 
     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
      <property name="hibernate.show.sql" value="true" /> 
     </properties> 
</persistence-unit> 
</persistence> 

यह सब ठीक है ,

em.getTransaction().begin(); 
em.persist(myObject); 
em.getTransaction().commit(); 

मैं हाइबरनेट विन्यास के साथ कुछ कमी कर रहा हूँ या यह भी एक का उपयोग करना संभव है: d अच्छा है, लेकिन मैं वास्तव में उपयोग करना चाहते हैं:

em.persist(myObject); 
बजाय

जेटीए डेटासोर्स?

उत्तर

11

ऐसा लगता है कि आपकी कॉन्फ़िगरेशन के लिए कंटेनर-प्रबंधित लेन-देन डिफ़ॉल्ट रूप से उपयोग किया जाता है। इस मामले में आपको लेनदेन सिंक्रनाइज़ेशन का एक तरीका परिभाषित करने की आवश्यकता है ताकि दृढ़ता परत अधिसूचित हो (और उदाहरण के लिए दूसरे स्तर के कैश को अपडेट कर सकें)। तो आप निम्नलिखित के रूप में manager_lookup_class संपत्ति परिभाषित करने की जरूरत:

// For GlassFish: 
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.SunONETransactionManagerLookup 
// For WebSpere: 
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.WebSphereExtendedJTATransactionLookup 
// For JBoss: 
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup 
// For OpenEJB: 
hibernate.transaction.manager_lookup_class=org.apache.openejb.hibernate.TransactionManagerLookup 

इसके अलावा आपको लगता है कि के रूप में "लेन-देन संबंधी" डेटा परत का उपयोग व्यापार के तरीकों को चिह्नित करने के लिए है। इसके लिए आपको @javax.ejb.TransactionAttribute(REQUIRED) के साथ उन्हें चिह्नित करने की आवश्यकता है (इस एनोटेशन के बारे में अधिक जानकारी के लिए here देखें)।

आपके पास बीन-प्रबंधित लेनदेन पर स्विच करने का विकल्प भी है। आप कह रही द्वारा यह कर सकते हैं:

hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory

फिर सेम शुरू करने/लेन-देन समाप्त होने के लिए जिम्मेदार है:

org.hibernate.Session session = ...; 
org.hibernate.Transaction tx = null; 
try { 
    tx = session.beginTransaction(); 
    session.createQuery(...); // do some staff 
    tx.commit(); 
} catch (HibernateException e) 
{ 
    if (tx != null) { 
     tx.rollback(); 
    } 
} 
+2

ठीक है, तो मैं संपत्ति नाम = "hibernate.transaction.manager_lookup_class" जोड़ा < मूल्य = "org.hibernate.transaction.SunonETransactionManagerLookup" /> मेरे persistence.xml पर। अब यह त्रुटि के बिना "बनी रहती है", लेकिन यह डेटाबेस के लिए कभी भी प्रतिबद्ध नहीं होती है। – KevMo

+0

@ केवीमो: आपको 'em.getTransaction() शुरू करें() शुरू करें, जैसा कि आप सीएमटी का उपयोग कर रहे हैं, एक लेनदेन को घोषणात्मक रूप से शुरू करने की आवश्यकता नहीं है। मुझे आशा है कि आपने अपनी बीन विधि को '@ ट्रांजेक्शनल 'के साथ चिह्नित किया है? –

+0

ओपीएस, क्षमा करें, आप वसंत का उपयोग नहीं कर रहे हैं :) तो मेरे जवाब का पालन करें। –

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