2012-06-06 13 views
9

का उपयोग करते समय एक EntityTransaction उपयोग नहीं कर सकते।मैं यह त्रुटि प्राप्त कर रहा हूँ JTA

मेरे persistence.xml फ़ाइल के रूप में अनुवर्ती है:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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_2_0.xsd"> 
    <persistence-unit name="acmeauction"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/MySQLJDBCResource</jta-data-source> 
     <class>it.uniroma3.acme.auction.model.User</class> 
     <class>it.uniroma3.acme.auction.model.Auction</class> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/acmeauction"/> 
      <property name="javax.persistence.jdbc.user" value="user"/> 
      <property name="javax.persistence.jdbc.password" value="password"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

क्या मुझे क्या करना कोशिश कर रहा हूँ एक वस्तु (उपयोगकर्ता) लागू करने के लिए, इस तरह से है:

@ManagedBean 
public class UserRepository implements Serializable{ 

    @PersistenceUnit 
    EntityManagerFactory emf; 

    @PersistenceContext 
    private EntityManager em; 

    private static UserRepository instance; 

    /** 
    * Gives back the singleton UserRepository singleton. 
    */ 
    public static UserRepository getInstance() { 
     if (instance==null) { 
      instance = new UserRepository(); 
     } 
     return instance; 
    } 

    private UserRepository() { 
     emf = Persistence.createEntityManagerFactory("acmeauction"); 
     em = emf.createEntityManager();    
    } 

    /** 
    * Save and persist a new User. 
    */ 
    public void save(User user) { 
     em.getTransaction().begin(); 
     em.persist(user); 
     em.getTransaction().commit(); 
    } 
} 

जबकि अगर यह एक साधारण जावा अनुप्रयोग से UserRepository इस्तेमाल करने की कोशिश, इसे सही ढंग से काम करता है।

अग्रिम धन्यवाद, एक

उत्तर

8

त्रुटि राज्यों के रूप में, यदि आप लेन-देन के लिए JTA उपयोग कर रहे हैं, तो आप JTA उपयोग करने के लिए की जरूरत है।

या तो JTA UserTransaction का उपयोग शुरू करने के लिए/लेन-देन के लिए प्रतिबद्ध है, या का उपयोग एक RESOURCE_LOCAL हठ इकाई और गैर JTA डेटा स्रोत।

देखें, http://en.wikibooks.org/wiki/Java_Persistence/Transactions

+2

धन्यवाद एक बहुत है, यह शर्मनाक है, लेकिन मैं कोड का वह हिस्सा काम कर रहा पर विचार किया। धन्यवाद, – andreaxi

14

आप em.getTransaction().begin(); है और न ही em.getTransaction().commit(); उपयोग करने के लिए नहीं जा सकते, इन निर्देशों का RESOURCE_LOCAL लेनदेन प्रकार के साथ प्रयोग किया जा सकता है।

आपके मामले में लेन-देन आपके विधि में EntitiyManager का इस्तेमाल पहली बार में, कंटेनर द्वारा किया जाता है, कंटेनर जाँच करता है कि वहाँ एक सक्रिय लेन-देन नहीं अगर कोई लेन-देन सक्रिय है तो यह एक बनाता है या, और जब विधि कॉल समाप्त होता है, लेन-देन कंटेनर से प्रतिबद्ध है। तो, अंत में आपकी विधि इस तरह दिखनी चाहिए:

public void save(User user) { 
    em.persist(user); 
} 

कंटेनर लेनदेन का ख्याल रखता है, जो जेटीए है।

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