2012-12-07 18 views
8

पर रिकॉर्ड सम्मिलित नहीं करता है मुझे EntityManager.persist(Object) विधि का उपयोग करने में समस्या है। अब जब मैं अपवाद के बिना ऐप काम करके अन्य समस्याओं से छुटकारा पाता हूं लेकिन ऑब्जेक्ट को मेरे डेटाबेस में नहीं रखा जाता है।EntityManager persist() विधि डेटाबेस

मेरी इकाई वर्ग:

@Entity 
@Table(name ="Chain") 
public class Chain implements Serializable{ 

@Id 
@Column(name = "id") 
    private Long id; 
@Column(name = "date") 
    private Date date; 
@Column(name = "name") 
    private String name; 
//setters and getters 
} 

मेरी दाव वर्ग:

@Transactional 
@Repository("ChainDao") 
public class ChainDaoImpl implements ChainDao{ 


    private EntityManager em; 


    @PersistenceContext 
    public void setEntityManager(EntityManager em) { 
     this. em = em; 
    } 

    public int saveChain(Chain chain) { 
     chain.setDate(new Date()); 
     chain.setId((long)44); 
     Boolean a; 
     em.persist(chain); 

     return 222; 
    } 
} 

मेरी xml संदर्भ:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
    <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"></property></bean> 


    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

    <bean class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" 
      ref="entityManagerFactory" /> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

और pereistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> 
     <persistence-unit name="sample"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <!-- Scan for annotated classes and Hibernate mapping XML files --> 
     <properties> 
      <property name="hibernate.archive.autodetection" value="class, hbm"/> 
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> 
      <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/database"/> 
      <property name="hibernate.connection.username" value="postgres"/> 
      <property name="hibernate.connection.password" value="pwd"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
      <property name="hibernate.show_sql" value="true"/> 
     </properties> 
     </persistence-unit> 

    </persistence> 

क्या किसी को पता है कि मुझे क्या याद आ रही है?

+0

अपने संस्था के लिए एक आईडी निर्दिष्ट न करें, और हाइबरनेट जाने (आईडी पीढ़ी तंत्रों में से एक का उपयोग करके) को बचाने के लिए उस पर आवंटित। –

+0

यदि मैं '@GeneratedValue (strategy = GenerationType.AUTO) का उपयोग करता हूं, तो मुझे' org.hibernate.exception.SQLGrammarException मिलता है: अगली अनुक्रम मान नहीं मिल सका ' – Grzzzzzzzzzzzzz

+0

कृपया अपनी वसंत-लेनदेन कॉन्फ़िगरेशन की जांच करें, मुझे इसी तरह की समस्या थी, और यह था अनुचित लेनदेन कॉन्फ़िगरेशन – blob

उत्तर

7

आप एक विशिष्ट अपवाद हो रही है बनाएँ? यह जानना उपयोगी होगा कि यदि आप हैं तो यह क्या होगा।

पहले से ही Stackoverflow पर यह करने के लिए इसी तरह की समस्याओं की एक संख्या हैं:

Spring transactional context doesn't persist data

Spring, Hibernate & JPA: Calling persist on entitymanager does not seem to commit to database

ये सुझाव है कि आप em.persist(chain) के बाद em.flush() जोड़ने का प्रयास करना चाहिए, और फेरबदल @transactional एनोटेशन

आपको यह भी जांचना चाहिए कि आपने एक लाइन के माध्यम से लेनदेन संबंधी टिप्पणियां सक्षम की हैं जैसे कि :

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

अपनी .xml विन्यास

+0

बात यह है कि कोई अपवाद नहीं है, कोड निष्पादित किया गया है, लेकिन डेटाबेस पर कोई रिकॉर्ड नहीं है। – Grzzzzzzzzzzzzz

+0

हम्म, निश्चित रूप से em.flush() को आजमाएं। – RoryB

+0

जब मैं 'फ्लश()' जोड़ता हूं तो मुझे 'javax.persistence मिला। ट्रांज़ेक्शन की आवश्यकता है अपवाद: कोई लेनदेन प्रगति पर नहीं है' क्या मुझे पूरा पता पोस्ट करना चाहिए? – Grzzzzzzzzzzzzz

-1

आप नीचे के रूप में आईडी पीढ़ी रणनीति आवंटित करने के लिए की आवश्यकता होगी:

@Entity 
@Table(name ="Chain") 
public class Chain implements Serializable{ 

@Id 
@Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 
@Column(name = "date") 
    private Date date; 
@Column(name = "name") 
    private String name; 
//setters and getters 
} 

और सेव विधि में

public int saveChain(Chain chain) { 
     chain.setDate(new Date()); 
     //chain.setId((long)44); remove this line 
     Boolean a; 
     em.persist(chain); 

     return 222; 
    } 

अगर आप क्रमांक दें और इसके बाद/जेपीए हाइबरनेट रिकॉर्ड को अपडेट करने है, जो की कोशिश करेंगे नया रिकॉर्ड डालने की बजाय उपलब्ध नहीं है और मुझे लगता है कि अपवाद नहीं फेंक देगा।

+0

अभी भी नहीं डेटाबेस में अपवाद या रिकॉर्ड .. – Grzzzzzzzzzzzzz

+0

'em.flush()' के साथ मैन्युअल रूप से फ़्लश करने का प्रयास करें, लेनदेन कैसे कॉन्फ़िगर किया गया है? –

+0

आपका मतलब वसंत विन्यास है? '<बीन आईडी =" लेनदेन प्रबंधक "वर्ग =" org.springframework.orm.jpa।JpaTransactionManager "> <संपत्ति नाम =" entityManagerFactory "रेफरी =" entityManagerFactory "/> ' – Grzzzzzzzzzzzzz

1

क्या आप पोस्ट कर सकते हैं कि आप क्या अपवाद प्राप्त कर रहे हैं? मुझे लगता है कि आपकी त्रुटि यह है कि आपका persistence.xml आपने अपनी "चेन" ऑब्जेक्ट निर्दिष्ट नहीं किया है।

आप इस टैग के

<exclude-unlisted-classes>false</exclude-unlisted-classes> 

या बस

<class>your.package.Chain</class> 

प्रदाता टैग के ऊपर इस रखो का उपयोग कर निर्दिष्ट कर सकते हैं।

इसके अलावा, setted मूल्य के साथ एक आईडी स्तंभ के साथ) एक कॉलम @Id

के रूप में चिह्नित आप को बचाने (विधि का उपयोग करते के लिए एक नंबर सेट नहीं, हाइबरनेट अद्यतन करने की कोशिश अपने डेटा सम्मिलित नहीं होंगे।

यह करें: getEntityManager विधि

public EntityManager getEntityManager() { 
    return entityManager; 
} 

फिर

@Transactional 
public void saveChain(Chain chain) { 

    chain.setDate(new Date()); 
    getEntityManager().persist(chain); 
} 
+0

अभी भी कोई अपवाद नहीं है और डेटाबेस – Grzzzzzzzzzzzzz

+1

ओएमजी में कोई रिकॉर्ड नहीं है, मैंने इस समस्या के साथ कुछ घंटे बिताए हैं = पी .. मेरे मामले में मैं ऊंट, वसंत और हाइबरनेट + जेपीए का उपयोग कर रहा हूं .. मैं थोड़ा विस्तार भूल गया। गायब था ** @ ट्रांजैक्शनल ** एनोटेशन मेरे ** में @ सेवा ** विधि। ** फ्लश ** के बारे में संकेत के लिए धन्यवाद। मैंने बस फ्लश डाला है और लॉग में लंबे समय से प्रतीक्षित अपवाद दिखाई देता है। संभावित कारणों के बारे में अच्छा लिंक: http://www.scarba05.co.uk/blog/2010/02/hibernate-jpa-is-swallowing-my-data-no-save-no-error/ –

+0

धन्यवाद मेरा समय बचा लिया है यह em.flush() के कारण था। –

5

में इस प्रयास करें:

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

पुनश्च: साथ ही आप अपने आईडी के लिए एक पीढ़ी विधि स्थापित करना चाहिए।

<persistence-unit name="OwnerPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.test.domain.local.Entity</class> 
    <exclude-unlisted-classes /> 
    </persistence-unit> 
</persistence> 
+3

'साझा इकाई प्रबंधक पर लेनदेन बनाने की अनुमति नहीं है - इसके बजाय वसंत लेनदेन या ईजेबी सीएमटी का उपयोग करें' – Grzzzzzzzzzzzzz

+1

एक जेटीए EntityManager getTransaction() का उपयोग नहीं कर सकता – Julien

-1

मैं persistence.xml को इकाई जोड़कर एक ही समस्या को ठीक करने में सक्षम था

<!-- Open Entity Manager in View filter --> 
<filter> 
    <filter-name>openEntityManagerInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>openEntityManagerInViewFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
0

अपने web.xml करने के लिए इन जोड़ने से इस समस्या का समाधान हो सकता है::

0

मेरी समस्या हल

org.springframework.transaction.jta.JtaTransactionManager 

हो इस काम को पीओ!

0

AppConfig विन्यास फ़ाइल शीर्षक में उपयोग @EnableTransactionManagement